如何将左连接SQL脚本转换为Linq脚本?

时间:2016-09-26 12:54:45

标签: sql linq

如何将left join转换为linq脚本。我有这样的T-SQL:

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

我想将其转换为linq。

2 个答案:

答案 0 :(得分: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中应用left join来计算count。优化后的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() });

答案 1 :(得分:0)

这就是我提出的

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(),
            };

但是,我并不完全确定它是否适用于EF。

您可以随时执行以下操作:

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()
             };

此外,由于缺乏对数据库的了解,我无法证明其中任何一个查询的效果。