2010-03-17 75 views
7

我想檢查一個日期在LINQ中是否爲空,如果它不檢查它的未來日期。Linq where條款有多個條件和空檢查

QuestionnaireRepo.FindAll(q => !q.ExpiredDate.HasValue || q.ExpiredDate >DateTime.Now).OrderByDescending(order => order.CreatedDate); 

我需要第二次檢查才適用,如果第一個是真的。我正在使用單個存儲庫模式,並且FindAll接受了where子句

ANy想法?在這裏有很多類似的問題,但沒有給出答案,我對Linq很陌生,因爲你可能猜到了:)

編輯:我得到我現在需要的結果,但它將檢查>條件在某些情況下爲空值。這不是一件壞事嗎?

+0

你不能只是說在哪裏(q.ExpiredDate> DateTime.Now)?這應該返回ExpiredDate是未來日期的所有行。 – Richard

回答

8

這不工作?

QuestionnaireRepo.FindAll(
    q => (q.ExpiredDate == null) || (q.ExpiredDate > DateTime.Now)); 
+0

我正在返回活動條目:) – Andrew

+0

@SocialAddict:你能澄清你需要的確切標準嗎?你的問題是「檢查一個日期是否爲空......並且如果它不檢查它的過去日期」,這正是我的代碼所做的(以及迄今所有其他答案中給出的代碼)。但是,您問題中的示例代碼不會那樣做! – LukeH

+0

好點重寫,對不起:) – Andrew

2

如果這是LINQ到SQL或LINQ到實體隨後的HasValue不會轉換爲SQL表達式,你會得到一個異常。

這應該做到這一點。

QuestionnaireRepo.FindAll(q => q.ExpiredDate != null && q.ExpiredDate <= DateTime.Now) 
1

有一對夫婦,你可以做到這一點的方式,一個好的辦法是使用管道和過濾器,但看你是如何實現上述,它看起來並不像你想利用這個模式,使將不會進入它,但它的價值谷歌搜索。

隨着管道和過濾器模式,你可以這樣做:

 public static IQueryable<YourType> WithExpiryDate(this IQueryable<YourType> allMyTypes) 
     { 
      return allMyTypes.Where(f => f.ExpiredDate != null); 
     } 

     public static IQueryable<YourType> WhereExpiredDateBeforeThanNow(this IQueryable<YourType> allMyTypes) 
     { 
      return allMyTypes.Where(f => f.ExpiredDate <= DateTime.Now); 
     } 

然後就是去:​​

你也可以只說:

QuestionnaireRepo.FindAll(q => q.ExpiredDate != null && q.ExpiredDate <= DateTime.Now); 

希望這有助於...