2012-03-30 7 views
3

利回り - ... ParentCategoryIdは「トップレベル」カテゴリのnullにすることができます注意をNULL可能GUIDは、私は、階層カテゴリとサブカテゴリのセットを定義し、単純なSQLテーブル持っている意外な結果

CREATE TABLE [dbo].[Category](
    [CategoryId] [uniqueidentifier] NOT NULL, 
    [ParentCategoryId] [uniqueidentifier] NULL, 
    [Name] [nvarchar](50) NOT NULL 
) 

名前とParentCategoryIdで特定のカテゴリを見つけるLinq式を作成すると、Guidを設定すると正しい結果が得られません。ヌルに変数:これは、同じ結果が得られない

Guid? parentCategoryId = null; 

var category = dc.Categories 
    .Where(c => (
     (c.Name == "Fred") && 
     (c.ParentCategoryId == parentCategoryId) 
)); 

var category = dc.Categories 
    .Where(c => (
     (c.Name == "Fred") && 
     (c.ParentCategoryId == null) 
)); 

私はウェブ上で見つけることができるものから、他の人がこの問題を抱えているが、私はすることができていません問題を解決するためのきれいな回避策を見つけてください。

アイデアをいただければ幸いです。ありがとう。

追加情報 ここでは、最初にGuidのLINQ生成SQL文はありますか?その後、nullパラメータと簡単なヌルパラメータに:あなたが見ることができるように

-- With Guid? null parameter : return an empty record set 
DECLARE @p0 NVarChar(1000) SET @p0 = 'Fred' 
DECLARE @p1 UniqueIdentifier SET @p1 = null 
SELECT [t0].[CategoryId], [t0].[ParentCategoryId], [t0].[Name], [t0].[Timestamp] 
FROM [dbo].[cad_ScoCategory] AS [t0] 
WHERE ([t0].[Name] = @p0) AND ([t0].[ParentCategoryId] = @p1) 


-- With null parameter - returns a single (correct) record 
DECLARE @p0 NVarChar(1000) SET @p0 = 'Fred' 
SELECT [t0].[CategoryId], [t0].[ParentCategoryId], [t0].[Name], [t0].[Timestamp] 
FROM [dbo].[cad_ScoCategory] AS [t0] 
WHERE ([t0].[Name] = @p0) AND ([t0].[ParentCategoryId] IS NULL) 

、最初のオプションは、第2の方法はParentCategoryIdがNULL ISチェックとしてのヌルparaemeterでParentCategoryIdを比較 - 正しい

+0

1から休憩開始する場合は0です。 –

+1

SQL select文の生成を表示できますか? –

+0

異なる結果は何ですか? – Hogan

答えて

8

あるなしこれは残念なことに合理的に一般的な問題です。この問題を回避するには、明示的にnullを使用して比較することです:

また
.Where(c => c.Name == Fred && 
      ((c.ParentCategoryId == parentCategoryId) || 
      (c.ParentCategoryId == null && parentCategoryId == null))) 

、(使用されているフィルタに変更する)外部でクエリをチェックを実行します。あなたがあることが最初のためのParentIDを入れてはいけない理由

var category = dc.Categories.Where(c => c.Name == "Fred"); 
category = parentCategoryId == null 
    ? category.Where(c => c.ParentCategoryId == null) 
    : category.Where(c => c.ParentCategoryId == categoryId); 
+0

Jonさん、ありがとうございました。あなたの回避策は問題なく機能します。コードレベルでこの問題が発生するのは非常に簡単です。ヌル可能な型を比較す​​るときは、ノートから自己への警告は非常に注意してください。ご協力いただきありがとうございます。 – Neilski

関連する問題