Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用带有EF 6的Linq扩展方法编写子查询_C#_Linq_Entity Framework_Subquery_Extension Methods - Fatal编程技术网

C# 如何使用带有EF 6的Linq扩展方法编写子查询

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

我是linq的新手,我有3个带有这些列的表

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;