2014-04-30 36 views
0

我有以下LINQ語句,但是我不相信其實現這一目標的最佳途徑這個數據正確的方式(但我不知道):這是返回使用LINQ

return 
    Buyer.Where(x => 
     x.OperatingCalendar.BankHolidays.Any(y => y.OccursOn == today.Date)) ?? 
     Buyer.Where(x => 
      x.OperatingCalendar.DayOfWeek.DayID == (int)today.DayOfWeek); 

這個想法是查詢Buyer.OperatingCalendar查找表示今天是公共假期的行,以及如果它不是公共假期表示星期幾的行。一些買家沒有任何行。

關鍵是OperatingCalendar可能會爲每個買方的兩種情況都包含一行,但是如果存在公共假期,它必須重寫星期幾。如果沒有行存在,買方將返回空值。

由於唯一的數據要求,無法使用OR。下圖應解釋情況。

enter image description here

+0

既然您在任何一種情況下都要返回買方,您是否需要查看其中一個或另一個是否屬實?爲什麼BankHolidays支票首先是重要的?買方對象將包含bankholidats和dayofweek的集合。 – CharlesNRice

+2

這裏使用'??'將不起作用,因爲'Where'永遠不會返回'null'。 – sloth

+0

我不認爲你是表達式會做你想要的 - .Where返回一個可枚舉的列表,這將是空的,因此如果沒有項目,則不爲空。所以你呢?表達式永遠不會選擇第二個選項。您需要在每個表達式上執行.FirstOrDefault()。 –

回答

2

Where不會返回null所以?? operator沒用在這裏。假設你只想不斷拉一個結果呢,那麼你應該使用SingleOrDefault代替Where,這應該允許您使用??正確

return 
    Buyer.SingleOrDefault(x => 
     x.OperatingCalendar.BankHolidays.Any(y => y.OccursOn == today.Date)) ?? 
    Buyer.SingleOrDefault(x => 
     x.OperatingCalendar.DayOfWeek.DayID == (int)today.DayOfWeek); 

你可以,但是,在一個查詢這將節省您的做到這一點額外的數據庫之旅

return Buyer.SingleOrDefault(x => 
    x.OperatingCalendar.BankHolidays.Any(y => y.OccursOn == today.Date) || 
    x.OperatingCalendar.DayOfWeek.DayID == (int)today.DayOfWeek) 
+0

這第二個變體不起作用。還有其他與買方/ OperatingCalenderID相關的列 - 例如打開和關閉時間。因此找不到正確的OperatingCalendarID。 – dotnetnoob

+0

@dotnetnoob我只能根據給出的信息回答問題,在這種情況下,第二個例子在功能上等同於第一個例子,所以第一個變體的工作原理沒有意義,而第二個變體沒有意義。 – James

+0

SingleOrDefault的使用也失敗。我附加了數據庫模式以提供更多信息。 – dotnetnoob