Linq到实体Left Join

Mar*_*ark 5 linq linq-to-entities left-join outer-join

我想在Linq to Entities中实现以下功能:

获取没有应用程序或应用程序具有状态的所有查询!= 4(已完成)

select e.*
from Enquiry enq
left outer join Application app
 on enq.enquiryid = app.enquiryid
where app.Status <> 4 or app.enquiryid is null
Run Code Online (Sandbox Code Playgroud)

有没有人在没有使用Linq to Entities不支持的DefaultIfEmpty()之前完成此操作?

我正在尝试向IQueryable查询添加一个过滤器,如下所示:

IQueryable<Enquiry> query = Context.EnquirySet; 

query = (from e in query 
         where e.Applications.DefaultIfEmpty()
                             .Where(app=>app.Status != 4).Count() >= 1 
         select e);
Run Code Online (Sandbox Code Playgroud)

谢谢马克

小智 10

在EF 4.0+中,LEFT JOIN语法略有不同,呈现出一种疯狂的怪癖:

var query = from c1 in db.Category 
        join c2 in db.Category on c1.CategoryID equals c2.ParentCategoryID  
        into ChildCategory 
        from cc in ChildCategory.DefaultIfEmpty() 
        select new CategoryObject  
        { 
            CategoryID = c1.CategoryID,  
            ChildName = cc.CategoryName 
        } 
Run Code Online (Sandbox Code Playgroud)

如果在SQL Server Profiler中捕获此查询的执行,您将看到它确实执行了LEFT OUTER JOIN.但是,如果在Linq-to-Entity查询中有多个LEFT JOIN("Group Join")子句,我发现自连接子句实际上可以像在INNER JOIN中一样执行 - 即使使用了上面的语法!

对此的决议?疯了,据MS说,听起来不对,我通过改变连接子句的顺序来解决这个问题.如果自引用LEFT JOIN子句是第一个Linq Group Join,则SQL事件探查器报告了一个INNER JOIN.如果自引用LEFT JOIN子句是LAST Linq Group Join,则SQL事件探查器会报告LEFT JOIN.


Cra*_*ntz 6

做这个:

IQueryable<Enquiry> query = Context.EnquirySet; 

query = (from e in query 
         where (!e.Applications.Any()) 
               || e.Applications.Any(app => app.Status != 4)
         select e);
Run Code Online (Sandbox Code Playgroud)

我没有发现LINQ处理SQL"goofy"中的"外连接"问题.理解它的关键是根据具有可空属性的对象图而不是表格结果集来思考.

任何()映射到存在于SQL,所以它远远比计数更有效()在某些情况下.