5

私のエンティティには、タイプNewsItemの null 許容外部キー プロパティがあります。LibraryIDint?

私の問題は、プロパティをクエリして、それを 以外の値と比較すると、null例外が発生することです。

最初に私のコードは次のとおりでした:

int? lid = ...
var results = context.NewsItems
    .Where(n => n.LibraryID == lid);

しかし、何があっても結果はまったく得られませんlid

だから、私は試しました:

var results = context.NewsItems
    .Where(n => n.LibraryID.Equals(lid));

例外を与えます:

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

そして、私は試しました:

var results = context.NewsItems
    .Where(n => lid.Equals(n.LibraryID));

そして得た:

タイプ 'System.Nullable`1' をタイプ 'System.Object' にキャストできません。LINQ to Entities は、EDM プリミティブ型または列挙型のキャストのみをサポートします。

この:

var results = context.NewsItems
    .Where(n => object.Equals(lid, n.LibraryID));

最後の例外と同じ例外を与えます。

今、私は必死だったので、物事を複雑にしようとしました(たとえば、ここで提案されている他のフォーラムのように):

var results = context.NewsItems
    .Where(n => (lid == null ? n.LibraryID == null : n.LibraryID == lid));

それでも同じ例外が発生します。

それで...簡単な回避策はありますか?

4

5 に答える 5

2

どうですか

var results = context.NewsItems
    .Where(n => lid.HasValue ? lid.Value == n.LibraryId.Value : (!n.LibraryId.HasValue) );
于 2013-03-14T04:00:15.793 に答える
1

うーん、その最初のスニペットは機能するはずです。私はそのようなnullableを何度も使用しました。私が最初に行うことは、LibraryID実際int?にそうではないlong?か、または類似していることを確認するためのサニティチェックです。

それ以外に、これを試すことができます:

var results = context.NewsItems
    .Where(n => (lid.HasValue ? n.LibraryID == lid.Value : !n.LibraryID.HasValue));

?:または、クエリ内を避けるには:

var results = lid.HasValue 
    ? context.NewsItems.Where(n => n.LibraryID == lid.Value)
    : context.NewsItems.Where(n => !n.LibraryID.HasValue);
于 2013-03-14T02:20:55.237 に答える
0

MSDN docs (私が最終的に見つけた) によると、 .Where() はコレクションのみをフィルタリングします。実際に結果があるかどうかを確認したい場合は、.ToList()、GetEnumerator を使用してフィルター処理されたクエリを遅延実行するか、foreach を使用してコレクションを列挙することで解決します。

このメソッドは、遅延実行を使用して実装されます。即時の戻り値は、アクションを実行するために必要なすべての情報を格納するオブジェクトです。このメソッドによって表されるクエリは、GetEnumerator メソッドを直接呼び出すか、Visual C# の foreach または Visual Basic の For Each を使用して、オブジェクトが列挙されるまで実行されません。

http://msdn.microsoft.com/en-us/library/bb534803.aspx

int? lid = ...
var results = context.NewsItems
    .Where(n => n.LibraryID == lid).ToList();
于 2013-03-14T02:15:35.793 に答える
0

EF が正しい演算子のオーバーロードを見つけられないようです。したがって、 を設定すると、間違った結果が生成されlid = nullます。

AsEnumerable()クエリに追加してオブジェクトにlinqを使用すると、すべて問題ありません。

var results = context.NewsItems.AsEnumeryble().Where(n => n.LibraryID == lid);
于 2013-03-14T06:29:52.523 に答える
0
var results = context.NewsItems
    .Where(n => n.LibraryID.HasValue && n.LibraryID.Value == lid.Value );

編集:

以前のフィルターは、特定の値を持つ全体にフィルターをかけたいという私の理解に基づいていました。更新すると、null または値にフィルターされます。

   var results = context.NewsItems
        .Where(n => !n.LibraryID.HasValue || n.LibraryID.Value == lid.Value );
于 2013-03-14T03:02:47.630 に答える