2012-09-25 63 views
1

我有LINQ的問題(使用EF - 4.3.1.0)使用以下:LINQ的使用可爲空的時間字段

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進來作爲一個字符串,所以我不得不將其轉換爲可空約會時間。分析日期也一樣。

我感到驚訝的是,我的公司ID爲13. dtcollected的空值。並且已經在表中使用了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的空值? 我做錯了什麼。

+2

LINQ到什麼地步?這看起來像是一個在4.5中修復的EF錯誤 – SLaks

+0

是的,pwDateCollected在表中爲空,並且在特定記錄的c#中dtcollected爲null。 –

+0

是的,EF不能處理的查詢,其中 == 其中兩個爲NULL。這應該被翻譯爲 IS NULL,但它轉換爲 = NULL,它不會給出正確的結果。 – Maarten

回答

1

在大多數數據庫系統(絕對的SQL Server),如果比較一側爲空,那麼比較的結果是未知的,因此不包括在結果集(或,對於所有意圖和目的,假)。

這就是說,你需要爲空對您的變量進行檢查,只對數據庫字段檢查,如果該參數不爲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)