Linq-to-sqlで奇妙な問題に遭遇しました。次の例では、
var survey = (from s in dbContext.crmc_Surveys
where (s.crmc_Retail_Trade_Id == tradeId) && (s.State_.Equals(state))
select s).First();
TradeIdがnullの場合、代わりにこのようにnullを具体的に指定した場合と同様に動作しません。
var survey = (from s in dbContext.crmc_Surveys
where (s.crmc_Retail_Trade_Id == null) && (s.State_.Equals(state))
select s).First();
これが私の望ましい行動です。実際、両方の値がnullでない限り、何も返しません。いくつかの異なるlinqクエリを除いて、これを実現する方法がわかりません。何か案は?
where (s.crmc_Retail_Trade_Id == tradeId)
を
where (s.crmc_Retail_Trade_Id == tradeId ||
(tradeId == null && s.crmc_Retail_Trade_Id == null))
編集-に基づいて この投稿 Brant Lambornによると、次のようになります。
where (object.Equals(s.crmc_Retail_Trade_Id, tradeId))
Null Semantics(LINQ to SQL) MSDNページは興味深い情報にリンクしています:
LINQ to SQLは、C#nullまたはVisual Basicの何も比較セマンティクスをSQLに課しません。比較演算子は構文的に対応するSQLに変換されます。セマンティクスは、サーバーまたは接続設定で定義されたSQLセマンティクスを反映しています。デフォルトのSQL Server設定では、2つのnull値は等しくないと見なされます(設定を変更してセマンティクスを変更することはできます)。とにかく、LINQ to SQLはクエリ変換でサーバー設定を考慮しません。
リテラルnull(なし)との比較は、適切なSQLバージョン(is nullまたはnot nullではない)に変換されます。
照合順序のnull(なし)の値はSQL Serverによって定義されます。 LINQ to SQLは照合順序を変更しません。
これは不明ですが、linq-to-sqlがそれをSQLクエリ文字列に変換すると、null
を直接指定するわずかに異なる式が得られ、ある時点でNULLをそれ自体と比較するようになると思います。 NULL = NULLはfalseと定義されています。
私もこの問題に遭遇したので、これを解決する別のオプション。
where (tradeId == null ? s.crmc_Retail_Trade_Id == null : s.crmc_Retail_Trade_Id == tradeId)
私はLinqに詳しくありませんが、一般的には次のとおりです。
NULL
は、欠落、不明、または未定義の値を表します。厳密に言えば、変数はNULL
と同じにすることはできません。このコンストラクトを提供する低レベルの言語は、簡単な代替手段がないため、通常は便利なように機能します。より高いレベルでは、通常、ISNULL
、defined
、またはその他の機能に依存することをお勧めします言語供給。
1つの未定義変数が別の未定義変数と等しくありません(同じことがNULL == NULLにも適用されます)。 Joe Celkoは、髪の色が運転している車両の色と一致するすべての人を検索するクエリを記述する良い例があります。このクエリは、あらゆる場所を歩くハゲ男と一致する必要がありますか?
Linqを使用している場合、支援のためにlinqが必要な反復を実行するため、この目的のためにspを作成することをお勧めします。
var c = lstQ_Buffer.Where(q => (((semesterId == 0 || semesterId == null ? q.fkSemesterId == null : q.fkSemesterId == semesterId) && (subjectSpecialtyId == 0 || subjectSpecialtyId == null ? q.fkSubSpecialtyId == null : q.fkSubSpecialtyId == subSpecialtyId) && (subTopicId == 0 || subTopicId == null ? q.fkSubTopicId == null : q.fkSubTopicId == subTopicId)) && (q.fkProgramId == programId && q.fkYearId == yearId && q.fkCourse_ModuleId == courseModuleId && q.fkSubject_SpecialtyId == subjectSpecialtyId && q.fkTopicId == topicId && q.fkDifficultyLevelId == diffucultyLevelId))).ToList();