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 の「状態」フィールドは null 可能です...そして null の場合、「すべての状態」を意味するために使用されます。そのため、「c.State」が null の場合、レコードを一致させたいと考えています。これを SQL で書くとしたら、次のようにします。

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

残念ながら、次のエラーが表示されます。

名前 'a' は 'equals' の右側のスコープにありません。「等しい」の両側の式を交換することを検討してください。

これを機能させる秘訣を教えてくれる人に感謝します。

ありがとう。

4

3 に答える 3

3

「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;

私のためにこれを見てくれたすべての人に感謝します。:)

于 2013-01-16T12:15:46.903 に答える
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 に答える