【问题标题】:How to generate IS NULL and IS NOT NULL in Entity Framework 6 in LEFT JOIN如何在 LEFT JOIN 的实体框架 6 中生成 IS NULL 和 IS NOT NULL
【发布时间】:2017-08-30 07:36:09
【问题描述】:

这就是场景。 我有两个表处于 1 对 M 关系;

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

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

注意子行是可选的(标题记录可能没有对应的行,因此是左连接。

我对使用 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 已经发展,并且对早期版本的功能不感兴趣。

【问题讨论】:

    标签: c# entity-framework linq isnull dbnull


    【解决方案1】:

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

    您的查询应该是:

    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;
    

    【讨论】:

    • 这太“荒谬”了!因此在实体级别而不是特定字段检查 null。效果很好,已接受答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 2015-09-22
    • 2015-02-25
    • 1970-01-01
    • 2012-07-31
    相关资源
    最近更新 更多