1

次を使用したLINQ(EF --4.3.1.0を使用)に問題があります。

    DateTime? dtcollected = DateTime.TryParse(dateCollected, out dateVal) ? dateVal : (DateTime?)null;
    DateTime?  dtanalyzed =  DateTime.TryParse(dateanalyzed, out dateVal) ? dateVal : (DateTime?)null; 


     var doesexist = (from pw in dbContext.WtTbl                                      
                      where pw.CompanyId == 13
                      && pw.DateCollected == dtcollected
                      && pw.DateAnalyzed == dtanalyzed                                    
                      select pw).Any();

dateCollectedは文字列として入力されたため、null許容のDateTimeに変換する必要があったことに注意してください。日付分析についても同じことが言えます。

私が驚いたのは、companyIdが13であるということです。dtcollectedのnull値。そして、dtanalyzedの値はすでにテーブルにあるので、doesexistがtrueを返すことを期待しますが、falseを返します。

コメントアウトしたら

     var doesexist = (from pw in dbContext.WtTbl                                      
                      where pw.CompanyId == 13
                    //   && pw.DateCollected == dtcollected
                      && pw.DateAnalyzed == dtanalyzed                                    
                      select pw).Any();

または置く:

      var doesexist = (from pw in dbContext.WtTbl                                      
                      where pw.CompanyId == 13
                      && pw.DateCollected == null
                      && pw.DateAnalyzed == dtanalyzed                                    
                      select pw).Any();

それから私は真実を得る。なぜdtcollectedのnull値を理解できないのですか?私は何か間違ったことをしていますか?

4

1 に答える 1

1

ほとんどのデータベースシステム(間違いなくSQL Server)では、比較の片側がnullの場合、比較の結果は不明であるため、結果セットに含まれません(または、すべての目的と目的でfalse)。

とはいえ、変数に対してnullのチェックを実行する必要があります。たとえば、次のように、パラメーターがnullでない場合にのみデータベースフィールドに対してチェックします。

var doesexist = (
    from pw in dbContext.WtTbl                                      
    where 
        pw.CompanyId == 13 && 
        (dtcollected == null || pw.DateCollected == dtcollected) &&
        (dtanalyzed == null || pw.DateAnalyzed == dtanalyzed)
    select pw).Any();

これは大まかに次のように解釈されます。

declare @dtcollected date = null
declare @dtanalyzed date = null

select 
    * 
from 
    Table as t
where
    (@dtcollected is null or t.DateCollected = @dtcollected) and
    (@dtanalyzed is null or t.DateAnalyzed  = @dtanalyzed)
于 2012-09-26T13:23:23.003 に答える