如何在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;
场景是这样的。 我在 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;