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 以字符串形式出现,因此我必须将其转换为可为空的 DateTime。日期分析也是如此。

令我震惊的是,我的 companyId 为 13。dtcollected 为空值。dtanalyzed 的值已经在表中,所以我希望 doexist 返回 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)中,如果比较的一侧为空,则比较的结果是未知的,因此不包含在结果集中(或者,出于所有意图和目的,为 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 回答