2014-09-18 121 views
1

這裏使用內三元操作員是我的代碼:Lambda表達式

var now = DateTime.Now; 
var firstOfMonth = new DateTime(now.Year, now.Month, 1, 0, 0, 1); 

var objectsAfterFirstOfThisMonth= _context.DataObjects 
    .Where(x => x.dateClosed == null ? x.dateClosed : x.dateCreated > firstOfMonth); 

我得到以下編譯錯誤:

There is no implicit conversion between 'System.Nullable' and 'bool'

我不明白的lambda語法有足夠的瞭解這個錯誤。

如果我無法使用這種三元語法,那麼我需要從數據庫中獲取DataObjects的完整列表,然後遍歷此列表,創建過濾列表(日期晚於當前第一個月),因爲我去。

我的目標簡而言之就是:我想獲得本月第一個月之後發生的所有對象。 dateCreated字段永遠不爲null。 dateClosed有時爲空。 dateClosed更準確,我想盡可能在​​該日期進行比較,但需要在dateCreated時返回,以防dateClosed爲null。

如果我需要提供更多信息,請讓我知道。

提前致謝!

+1

編譯器顯然是在告訴你什麼是錯的。 – Mephy 2014-09-18 23:44:38

回答

3

雖然我相信@TyCobb貼爲什麼你有一個問題的正確原因,我不知道他的回答會給你你正在尋找的查詢。看來你想得到一個日期並將其與firstOfMonth進行比較?

如果是這樣,我想你可能想是這樣的:

var objectsAfterFirstOfThisMonth= _context.DataObjects 
    .Where(x => (x.dateCreated != null ? x.dateCreated.Value : x.dateClosed) > firstOfMonth); 
+0

這解決了我正在嘗試做的事情!感謝您試着瞭解我的問題的背景。 – Brian 2014-09-19 14:06:32

+1

我只是不明白邏輯應該是什麼,因爲它說dateCreated從不爲空,但它檢查爲空。通過一個空值來判斷是否是謂詞之外的安全檢查。 – TyCobb 2014-09-19 16:22:43

4
....Where(x => x.dateCreated == null ? x.dateCreated : x.dateClosed > firstOfMonth); 

謂詞必須變成bool。您的x.dateCreatedDateTime?(假設)。您必須在評估爲true/false的真實部分中做一些事情。

像下面這樣的東西應該讓它編譯,但只作爲一個例子。我不知道你的實際邏輯應該是什麼,因爲你說dateCreated永遠不是null,但你檢查爲空。請注意,這些都評估爲真/假值。

....Where(x => x.dateCreated == null ? 
         x.dateCreated.HasValue : 
         x.dateClosed > firstOfMonth); 
+0

感謝您幫助我擺脫錯誤。 – Brian 2014-09-19 14:05:30