8

我正在尝试使用 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”字段可以为空……当它为空时,它用于暗示“所有状态”。因此,当“c.State”为空时,我希望记录匹配。如果我要在 SQL 中编写它,我会使用以下内容:

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

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

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

我将感谢任何可以让我了解使这项工作的秘诀的人。

谢谢。

4

3 回答 3

3

您可以修改您的代码,如:

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;

Ajoin本质上是一个where子句,所以这里我们可以使用该where子句,因为有join.

于 2013-01-16T11:22:35.023 回答
3

我设法通过将“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;

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

于 2013-01-16T12:15:46.903 回答
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)
于 2019-07-20T10:29:08.483 回答