6

私の質問に関連するstackoverflowに関するQ&Aはたくさんありますが、このシナリオで最適に機能する問題の理由と解決策を推測することはできません。

だから私はあなたがparentIDを渡すことを可能にするメソッドを持っています、そして値に基づいてレコードはLINQクエリを使用してフィルタリングされます。データベースのフィールドはNULL値を許可します。ここで、where句で演算子を使用してフィールドを比較する==と、発行されたSQLが間違っているため(IS NULL比較には使用されません)、クエリの結果は0になります。私はこれを方法を使って解決しObject.Equals()ました。それは機能しましたが、整数であるNONNULL値を渡すときに例外が発生します

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

だから私は簡単な方法を書きました

using (TestEntities context = new Entities())
{
    return from c in context.ItemMappings
           where c.ParentID.Equals(parentID)
           select new ItemDTO
           {
               ItemID = c.Item.ItemID,
               ItemName = c.Item.ItemName,
               ItemType = new ItemTypeDTO
               {
                   TypeID = c.Item.Type.TypeID,
                   TypeName =c.Item.Type.TypeName
               };
}
4

3 に答える 3

3

はい、SQLの場合にも問題が発生します。nullを明示的に処理する必要があり、これは機能するはずです。

Where (parentID == null && c.ParentID == null) || (parentID == c.ParentID)

これは、nullが一致することを前提としています。nullですべての結果をフィルタリングせずに返す場合は、代わりに次のようにします。

Where (parentID == null) || (parentID == c.ParentID)

私は時々これに問題を抱えていました、そしてLINQがいつも正しく翻訳する方法がすることであるとわかりました:

Where (parentID == null) || (parentID != null && parentID == c.ParentID)

これは、SQLでも、ここParentID = @ParentIDで実行すると、null一致は結果を返さず、を使用ISNULLして空白にエスケープする必要があるためです。

于 2013-03-25T16:05:33.283 に答える
1

null許容型を許可するにはこのように試すこともできます

  GSectionID = emp.SectionID ?? Guid.Empty,
于 2014-04-30T11:35:22.500 に答える
1

EF6では、UseCSharpNullComparisonBehaviorを使用してこの問題を解決できます。コンテキストオプションUseCSharpNullComparisonBehaviorをtrueに設定する必要があり、C#のように動作します。

objectContext.ContextOptions.UseCSharpNullComparisonBehavior = true;

詳細については、次のリンクを参照してください:http: //entityframework.codeplex.com/workitem/145

于 2014-05-05T18:38:30.467 に答える