LINQ to Entities加入Nullable字段,其中Null意味着"匹配所有"

时间:2013-01-16 10:37:04

标签: c# linq entity-framework

我正在尝试使用Entity Framework 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”为null时,我希望记录匹配。如果我在SQL中写这个,我会使用以下内容:

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

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

名称'a'不在'equals'右侧的范围内。考虑交换'equals'两侧的表达式。

我会感激任何能让我了解这项工作秘诀的人。

感谢。

3 个答案:

答案 0 :(得分:2)

您可以使用“ from”语法代替“ join”

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

答案 1 :(得分:1)

您可以修改代码,如:

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

答案 2 :(得分:1)

我设法通过将“DataType”检查从WHERE移动到JOIN,并将“状态”检查从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;

非常感谢所有为我看过这个的人。 :)