6

したがって、iQueryables は SQL ステートメントに変換されるため、where 句に入れる可能性のあるすべてのメソッドを処理できないことがわかっています。

しかし、これは私がやろうとしていることです:

int[] alreadySelectedIds = ...
var subjects = Entities.NewInstance.Subjects.Where(x => Array.IndexOf(alreadySelectedIds, x.Id) == -1).ToList();

そして、以下のような投稿を読んで、EF5 がこれを翻訳できるはずだと安心しました。
キーが ID のリスト (または配列) に一致するエンティティを取得
する LINQ を使用して配列から Int ID をクエリする

ただし、次のエラーが発生します。

LINQ to Entities はメソッド 'Int32 IndexOf[Int32](Int32[], Int32)' メソッドを認識せず、このメソッドはストア式に変換できません。

そして、このエラーをグーグルで検索しても、あまり役に立ちません。

私も試してみました

var newSubjects = Entities.NewInstance.Subjects.Where(x => alreadySelectedIds.Contains(x.Id)).ToList();

タイプ 'System.Int32[]' の null 定数値を作成できません。このコンテキストでは、エンティティ型、列挙型、またはプリミティブ型のみがサポートされます。

List<int> alreadySelectedIds = ...

タイプ 'System.Collections.Generic.List`1' の null 定数値を作成できません。このコンテキストでは、エンティティ型、列挙型、またはプリミティブ型のみがサポートされます。

私は立ち往生しており、私の脳は、どんなタイプの優雅な回復の可能性も超えてどろどろになっています. 誰か私を救ってくれませんか?

4

1 に答える 1

6
Entities.NewInstance.Subjects.Where(x => alreadySelectedIds.Contains(x.Id)).ToList();

alreadySelectedIsnull でない場合は動作するはずです

クエリの内部または前に null チェックを実行できます。

Entities.NewInstance.Subjects.Where(x => alreadySelectedIds == null 
                                         ? true // or false 
                                         : alreadySelectedIds.Contains(x.Id)
                                    ).ToList();

alreadySelectedIds(これは、 nullの場合にすべてまたは何も必要ないかどうかに応じて、書き換えることができます)

//return all if null
x => alreadySelectedIds == null || alreadySelectedIds.Contains(x.Id)

また

//return nothing if null
x => alreadySelectedIds != null  && alrreadySelectedIds.Contains(x.Id)
于 2013-09-04T15:42:19.623 に答える