LINQ到实体在可空字段上连接,其中空意味着“匹配全部”

本文关键字:意味着 匹配全部 全部 实体 字段 连接 LINQ | 更新日期: 2023-09-27 17:53:45

我正在尝试使用实体框架5运行以下LINQ查询:

int taskId = 2;
query = from a in Table_A
        where a.StatusCode != "DONE"
           && a.Inbound
        join b in Table_B
            on a.Id equals b.Id_Table_A
        join c in Table_C
            on a.State equals (c.State ?? a.State)
        where 2 == c.Id_Task
           && b.DataType == c.DataType
        select a.Id;

导致我出现问题的行是:

on a.State equals (c.State ?? a.State)

Table_C中的"State"字段是空的…当它为null时,它被用来暗示"所有状态"。因此,当"c.State"为空时,我希望匹配记录。如果我要用SQL写这个,我会使用下面的语句:

JOIN Table_C ON Table_A.State = ISNULL(Table_C.State, Table_A.State)

不幸的是,我得到了以下错误:

名称'a'不在'equals'右侧的作用域内。考虑交换'equals'两边的表达式

我将感谢任何能告诉我这个工作秘诀的人。

谢谢。

LINQ到实体在可空字段上连接,其中空意味着“匹配全部”

您可以这样修改代码:

int taskId = 2;
query = from a in Table_A
        where a.StatusCode != "DONE"
           && a.Inbound
        join b in Table_B
            on a.Id equals b.Id_Table_A
        from c in Table_C
        where 2 == c.Id_Task
           && b.DataType == c.DataType
           && (c.State == null || a.State.Equals(c.State))
        select a.Id;

一个join本质上是一个where子句,所以这里我们可以使用where子句,由于join的限制。

我设法通过将"DataType"检查从WHERE移动到JOIN,并将"State"检查从JOIN移动到WHERE来实现这一点。结果代码如我所期望的那样工作:

query = from a in Table_A
        where a.StatusCode != "DONE"
           && a.Inbound
        join b in Table_B
            on a.Id equals b.Id_Table_A
        join c in Table_C
            on b.DataType equals c.DataType
        where 2 == c.Id_Task
            && (c.State ?? a.State) == a.State
        select a.Id;

非常感谢所有为我看这篇文章的人。:)

可以使用"from"语法代替"join"

from a in TableA
from b in TableB
.Where(x => (x.Buy ?? a.Buy) == a.Buy
        && (x.Parity ?? a.Parity) == a.Parity)