【问题标题】:How to write sub queries using Linq extension methods with EF 6如何使用带有 EF 6 的 Linq 扩展方法编写子查询
【发布时间】:2015-02-25 11:20:48
【问题描述】:

我是 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查询?

【问题讨论】:

标签: c# linq entity-framework subquery extension-methods


【解决方案1】:
var prospectus = new [] 
{ 
    new { CourseId = "C1", CourseName = "Database" },
    new { CourseId = "C2", CourseName = "HCI" },
    new { CourseId = "C3", CourseName = "Op Systems" },
    new { CourseId = "C4", CourseName = "Programming" }
};

var enrollment = new []
{
    new { TraineeID = "T1", CourseId = "C1", Date = new DateTime(2014, 12, 01) },
    new { TraineeID = "T2", CourseId = "C1", Date = new DateTime(2014, 12, 05) },
    new { TraineeID = "T1", CourseId = "C3", Date = new DateTime(2014, 12, 01) }
};

var notMatchingQueryStyle = from c in prospectus
                            where !enrollment.Any(r => c.CourseId == r.CourseId)
                            select c;

Resharper 唠叨我用All 而不是Any 来“简化”这个,去看看:

var notMatchingQueryStyle = from c in prospectus
                            where enrollment.All(r => c.CourseId != r.CourseId)
                            select c;

【讨论】:

    【解决方案2】:

    类似这样的:

    扩展方法:

    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;
    

    【讨论】:

      【解决方案3】:

      您必须执行两个查询,第一个是检索您要排除的 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();
      

      【讨论】:

        猜你喜欢
        • 2015-03-12
        • 1970-01-01
        • 1970-01-01
        • 2011-03-11
        • 1970-01-01
        • 1970-01-01
        • 2019-12-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多