2015-02-05 48 views
0

鑑於這種代碼:在需要說== NOT NULL的三元組中返回「NOT NULL」?

  dataSource = this.db.DailyProductionReportSummaries.Where(
       x => x.ShiftDate >= start && x.ShiftDate <= end && 
       x.Shift == (shift != null ? shift.Code : "SOMETHING ELSE") && //TODO: "SOMETHING ELSE" where it's not null 
       x.LineNumber == (shift != null ? lineNumber : 0) && //TODO: 0 where it's not null 
       x.ProductCode == (productNumber != 0 ? productNumber.ToString() : "SOMETHING ELSE") //TODO: "SOMETHING ELSE" where it's not null 
       ).ToList(); 

我需要在每個標有「TODO」類似(針對專門與//TODO第一線的ternaries地說:

如果shift有東西在裏面,返回shift.Code否則,返回將評估爲x.Shift == NOT NULL(或更清楚地,它評估爲x.shift != null)的「東西」

我在這裏只是抱着一個願望,還是我需要繼續前進,並將其擴大爲一堆if陳述? (我試圖凝聚多個if語句爲沒有大量的邏輯改變或重寫的東西更緊湊,以適應不斷變化的配置...

回答

4

最可讀的替代機制擴展到了一堆if聲明。請記住,你並不需要拼出每個備選方案,你不需要一堆if嵌套的,你可以通過調用Where反覆根本鏈的過濾器。

var query = this.db.DailyProductionReportSummaries.AsQueryable(); 

query = query.Where(x => x.ShiftDate >= start && x.ShiftDate <= end); 

if (shift == null) 
    query = query.Where(x => x.Shift != null 
          && x.LineNumber != null); 
else 
    query = query.Where(x => x.Shift == shift.Code 
          && x.LineNumber == lineNumber); 

if (productNumber == 0) 
    query = query.Where(x => x.ProductCode != null); 
else 
    query = query.Where(x => x.ProductCode == productNumber.ToString()); 

dataSource = query.ToList(); 
+0

哇靠!我就知道你連鎖,但不喜歡那是絕對不可思議的!Imma試試這個,讓你知道它是如何工作的! – MetalPhoenix 2015-02-05 16:04:40

+1

@MetalPhoenix請記住,IQueryable的表示「做一個查詢」,而不是這樣的結果。假設[語義上]等價的最終操作/樹如何創建IQueryable基本上是不相關的(EF可以使用可查詢的所有限制等)。查看應用查詢的實際SQL(即在ToList中)以查看最終發生的事情。 – user2864740 2015-02-05 16:08:26

+0

是的,如果我們總是假定它有一個值(它會),這似乎更多地是我需要的一個輕微的邏輯修改...更容易處理productNumber。這是比我想要完成的更好的解決方案!很容易忘記,這不是實際的結果或行動,而是「做」,因爲它由EF分隔。感謝您的提醒。 – MetalPhoenix 2015-02-05 16:12:28