4

これを取る:

int? item1 = null;
int? item2 = null;

someObjectList.Where(x => x.SomeItem1 == (item1 ?? x.SomeItem1)
                       && x.SomeItem2 == (item2 ?? x.SomeItem2) 
                    );

WheresomeObjectListは空ではなくSomeItem1SomeItem2リストnull内のすべてのオブジェクトにあります。

なぜ何も返さないのですか?

編集:

私のコード:

public void GetPlacementsByMaterial(long clientMaterialID)
{
    ClientMaterial clientMaterial = ((ApplicationEntityModel)NavigationItem.ObjectContext).ClientMaterial.FirstOrDefault(x => x.ClientMaterialID == clientMaterialID);

    var list = GetPlacementList(supplier, mediaSpace);

    PlacementsList = list.Where(x => x.MediaCategoryFormatID == (clientMaterial.MediaCategoryFormatID ?? x.MediaCategoryFormatID)
                                                && x.MediaCategorySizeID == (clientMaterial.MediaCategorySizeID ?? x.MediaCategorySizeID) 
                             );
}

すべての ID はNullable<long>.

編集:

SQL プロファイラー:

SELECT *
  FROM [dbo].[CampaignSchedulePlacements] AS [Extent5]
WHERE ([Extent5].[MediaCategoryFormatID] = [Extent5].[MediaCategoryFormatID]) AND ([Extent5].[MediaCategorySizeID] = [Extent5].[MediaCategorySizeID])

注: `SQL をクリーンアップしました。

4

1 に答える 1

5

SQL では、NULL は NULL と等しくありません。

NULL は、「値はあるが、それが何であるかはわかりません」という意味として解釈できます。したがって、2 つの NULL 値を比較している場合、「最初の不明な値は 2 番目の不明な値と等しいか?」という疑問が生じます。もちろん、そうであると仮定する理由はないので、SQL は「いいえ」と言います。

これがあなたの問題を引き起こしていると思います。これは、生成された実際の SQL を見ることで確認できます。SQL = 演算子を使用している場合、これは確かに問題です。SQL Server を使用している場合は、SQL Management Studio などのデータベース ツールで SQL を実行することで、これを確認できます。

アップデート:

条件

([Extent5].[MediaCategoryFormatID] = [Extent5].[MediaCategoryFormatID]) 

[Extent5].[MediaCategoryFormatID] が NULL の場合、実際には false を返します。

これは、「なぜ何も返さないのですか?」という質問に答えます。

ただし、別の疑問が頭に浮かびます。なぜエンティティ フレームワークは、この linq クエリからその SQL を生成するのでしょうか?

残念ながら、エンティティへの linq はその SQL 生成の品質について正確にはわかっていません。このケースはそれを裏付けているようです。Linq to SQL を検討するかもしれません。それが長期的には行き止まりに見えるとしても、現在の実装はエンティティへのリンクよりもはるかに優れています。

どちらの場合でも、次のようなことを試しましたか

someObjectList.Where(x => 
    !item1.hasValue || 
    x.SomeItem1.HasValue && x.SomeItem1.Value == item1.Value)

ただし、プロファイラーの下でも、linq to entities が台無しになる可能性があることを確認してください。

于 2012-07-21T17:51:54.733 に答える