2016-09-26 11 views
1

left joinをlinqスクリプトに変換するにはどうすればよいですか。私は、LINQにこれを変換したい
左の結合SQLスクリプトをLinqスクリプトに変換する方法は?

SELECT 
    es.StandardID, 
    COUNT(DISTINCT esc.StandardCourseID) AS CourseIDCount, 
    COUNT(DISTINCT esp.StandardPostID) AS PostIDCount 
FROM EduStandards AS es 
LEFT JOIN EduStandardCourses AS esc 
    ON es.StandardID = esc.StandardID 
LEFT JOIN EduStandardPosts AS esp 
    ON es.StandardID = esp.StandardID 
GROUP BY es.StandardID 

:私はこのようなT-SQLを持っています。

答えて

0

以下は、linqでのクエリのレプリカである左結合によるクエリです。

var query = (from es in dbContext.EduStandards 
        join esc in dbContext.EduStandardCourses on es.StandardID equals esc.StandardID into ssc 
        from esc in ssc.DefaultIfEmpty() 
        join esp in dbContext.EduStandardPosts on es.StandardID equals esp.StandardID into ssp 
        from esp in ssp.DefaultIfEmpty() 
        select new { StandardId = es.StandardID, CourseCount = ssc.Count(), PostCount = ssp.Count() }).Distinct().ToList(); 

しかし、カウントを計算するために、linqで左結合を適用する必要はないと思います。最適化されたlinqクエリに続いて、同じ結果が返されます。

var query2 = (from es in dbContext.EduStandards 
        join esc in dbContext.EduStandardCourses on es.StandardID equals esc.StandardID into ssc 
        join esp in dbContext.EduStandardPosts on es.StandardID equals esp.StandardID into ssp 
        select new { StandardId = es.StandardID, CourseCount = ssc.Count(), PostCount = ssp.Count() }); 
0

これは、私はしかし、私はそれがEFのために働くだろう場合は、完全にはわからない

var query = from es in db.EduStandards 
      join esc1 in db.EduStandardCourses 
      on es.StandardId equals esc1.StandardId into esc 
      from c in esc.DefaultIfEmpty() 
      join esp1 in db.EduStandardPosts 
      on es.StandardId equals esp1.StandardId into esp 
      from p in esp.DefaultIfEmpty() 
      group new { es.StandardId, Course = c, Post = p } by es.StandardId into g 
      select new 
      { 
       StandardId = g.Key, 
       CourseIdCount = g.Where(x => x.Course != null).Count(), 
       PostIdCount = g.Where(x => x.Post != null).Count(), 
      }; 

を作ってみたものです。あなたは、常にこのような何かができ

:また

var query = from es in db.EduStandards 
      select new 
      { 
       es.StandardId, 
       CourseIdCount = db.EduStandardCourses.Where(esc => esc.StandardId == es.StandardId).Distinct().Count(), 
       PostIdCount = db.EduStandardPosts.Where(esp => esp.StandardId == es.StandardId).Distinct().Count() 
      }; 

を、私はあなたのデータベースの知識が不足しているため、これらのクエリのいずれかのパフォーマンスを証明することはできません。

関連する問題