如何在LEFT JOIN中生成IS NULL和IS NOT NULL in Entity Framework 6

How to generate IS NULL and IS NOT NULL in Entity Framework 6 in LEFT JOIN

场景是这样的。 我在 1-to-M 关系中有两个表;

为了便于说明,让我们将它们定义为

MyHeaderTable (headerID, col1, col2)
MyDetailTable (lineID, headerID, statusID, col3, col4)

注意 child 行是可选的(header 记录可能没有相应的行,因此 LEFT JOIN。

我对以下结果集感兴趣,使用 T-SQL :

SELECT MyHeaderTable h
    LEFT JOIN MyDetailTable c ON h.headerID = c.headerID
    WHERE c.lineID IS NULL  -- no corresponding children
    OR (c.lineID is NOT NULL AND c.statusID != 2) -- children rows must have status NOT 2

问题是如何在 EF6 linq 中编写上面的 T-SQL?

我的尝试出现在下面,但我在使用 IS NULL 和 IS NOT NULL 生成 linq 查询时遇到问题:

var query = from h in ctx.MyHeaderTable
            join c in ctx.MyDetailTable on h.headerID equals c.headerID into joinedTbl
            from j in joinedTbl.DefaultIfEmpty() //LEFT JOIN
            where j.lineID is null
            || (j.lineID != null && j.statusID !=2)
            select;
var results = query.ToList();

*注意 EF6 的特定版本,我知道 EF 已经发展并且对早期版本所做的不感兴趣。

EF 在检查实体本身是否为 null 时自动创建正确的查询。

您的查询应该是:

var query = from h in ctx.MyHeaderTable
            join c in ctx.MyDetailTable on h.headerID equals c.headerID into joinedTbl
            from j in joinedTbl.DefaultIfEmpty() //LEFT JOIN
            where j == null || (j != null && j.statusID != 2)
            select;