将 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的主要内容,如果未能解决你的问题,请参考以下文章