将 SQL 原始查询转换为 Linq

Posted

技术标签:

【中文标题】将 SQL 原始查询转换为 Linq【英文标题】:Convert SQL raw query into Linq 【发布时间】:2018-09-23 06:33:19 【问题描述】:

我有 3 个表(活动、参与者和注册),我想知道每个参与者参与的活动数量。我是编写 SQL Linq 查询的新手,请帮我将以下查询转换为 Linq。

Select count(Activities.ActivityId) AS NO_Activities,Activities.ActivityId,Enrollments.PostTestScore1
from Participants,Activities,Enrollments
where Participants.ParticipantId=Enrollments.ParticipantId
    and Activities.ActivityId=Enrollments.ActivityId
    and Enrollments.ParticipantId= 2883
    Group By Enrollments.PostTestScore1,Activities.ActivityId;

谢谢

【问题讨论】:

请不要只发布 SQL 并要求转换。至少显示一个类模型,以便导航属性和关联的多样性是可见的。此外,请说明您的目标是什么类型的 LINQ(针对实体?),并展示您自己的初步努力,以便我们了解具体您需要帮助的地方。最好的 LINQ 查询几乎不是 SQL 查询的 1:1 复制。 【参考方案1】:

我使用 Lambda 查询找到了答案,如下所示。

var no_ctivities = db.Activities
               .Join(
                   db.Enrollments,
                   ac => ac.ActivityId,
                   en => en.ActivityId,
                   (enr, act) => new  en = enr, ac = act )
               .Join(
                   db.Participants.Where(pr => pr.ParticipantId == id),
                   en => en.ac.ParticipantId,
                   prt => prt.ParticipantId,
                   (enr, prt) => new  enr.ac.PostTestScore1, enr.ac.PostTestScore2, enr.ac.ActivityId, enr.ac.AttendFirstday, enr.ac.AttendSecondDay )
               .Select(c => new
               
                   c.ActivityId,
                   c.PostTestScore1,
                   c.PostTestScore2,
                   c.AttendFirstday,
                   c.AttendSecondDay
               ).count();

【讨论】:

这是一个不同的查询。伯爵在哪里?此外,您应该使用导航属性,而不是连接。【参考方案2】:
var query = from a1 in Activities
            join e1 in Enrollments on a1.ActivityId equals e1.ActivityId
            join p1 in Participants on e1.ParticipantId equals p1.ParticipantId
            where e1.ParticipantId= 2883
            group new  e1, a1 
            by new  e1.PostTestScore1, a1.ActivityId  into g
            select new
            
                 ActivityId = g.Key.ActivityId,
                 PostTestScore1 = g.Key.PostTestScore1,
                 NO_Activities = g.Count()
            ;

【讨论】:

感谢它也帮助了我,但做了一些小改动。 我批准了这些更改

以上是关于将 SQL 原始查询转换为 Linq的主要内容,如果未能解决你的问题,请参考以下文章

将 SQL 转换为 Linq 查询

如何将 linq 查询转换为 SQL 查询?

将 SQL 子查询转换为 Linq 查询

协助将 SQL 查询转换为 LINQ 查询

将sql代码转换为linq(内连接查询)

将 SQL 转换为 LINQ 查询