C# 如何使用带有EF 6的Linq扩展方法编写子查询
我是linq的新手,我有3个带有这些列的表C# 如何使用带有EF 6的Linq扩展方法编写子查询,c#,linq,entity-framework,subquery,extension-methods,C#,Linq,Entity Framework,Subquery,Extension Methods,我是linq的新手,我有3个带有这些列的表 Trainee (ID, TraineeName) Course (ID, CourseName) TraineeCourseEnrollment (TraineeID, CourseID, EnrolledDate) 我创建了一个存储过程来使用此查询获取未注册的课程 select * from Course where ID not in (select CourseID from TraineeCourse
Trainee (ID, TraineeName)
Course (ID, CourseName)
TraineeCourseEnrollment (TraineeID, CourseID, EnrolledDate)
我创建了一个存储过程来使用此查询获取未注册的课程
select *
from Course
where ID not in (select CourseID
from TraineeCourseEnrollment
where TraineeID = @traineeid);
如何使用扩展方法将相应的linq查询写入此SQL查询?您必须执行两个查询,第一个是检索要排除的ID,第二个是获取实际课程:
var excludeIDs = db.TraineeCourseEnrollments.Where(w => w.TraineeID == traineeid).Select(s => s.CourseID);
var courses = db.Courses.Where(w =>!excludeIDs.Contains(w.ID)).ToList();
大概是这样的:
扩展方法:
int traineeid = ...;
var query = dc.Courses
.Where(c => ! dc.TraineeCourseEnrollments
.Where(o => o.TrainessID == traineeid)
.Select(o => o.CourseID)
.Contains(c.ID));
LINQ查询:
int traineeid = ...;
var query =
from c in dc.Courses
where !(from o in dc.TraineeCourseEnrollments
where o.TraineeID == traineeid
select o.CourseID)
.Contains(c.ID)
select c;
Resharper唠叨着让我用All
而不是Any
来“简化”这个过程,如图所示:
var notMatchingQueryStyle = from c in prospectus
where enrollment.All(r => c.CourseId != r.CourseId)
select c;
可能重复的
var notMatchingQueryStyle = from c in prospectus
where enrollment.All(r => c.CourseId != r.CourseId)
select c;