2016-02-18 15 views
0

我越來越:LINQ的讓,如果

非靜態方法需要一個目標。

問題是Status爲空。我不明白爲什麼,因爲有一個條件清楚地表明Status爲空返回1

var filterstatus = (from bq in basequery 
        let LastStatus = Status == null ? 1 
           : ((from sd in ems.SampleDatas 
           where sd.Reference_id == Status.id 
            && sd.DateTimeUTC <= bq.DateTimeUTC 
           orderby sd.DateTimeUTC 
           select ((sd.Value >= StatusValue) ? 1 : 0) 
            ).DefaultIfEmpty(1).FirstOrDefault()) 
        select new { bq, LastStatus }); 

回答

1

這是因爲它的轉換整個表達成SQL,而不是做在存儲器中的短路(短路會由數據庫來處理)。

你可以這樣寫,這樣可以在數據庫中正確短路(但仍然會生成查詢的右側)。

var statusID = Status == null ? (int?)null : Status.id; 

var filterstatus = (from bq in basequery 
    let LastStatus = 
     statusID == null ? 
     1 : 
     ((from sd in ems.SampleDatas 
      where sd.Reference_id == statusID && sd.DateTimeUTC <= bq.DateTimeUTC 
      orderby sd.DateTimeUTC 
      select ((sd.Value >= StatusValue) ? 1 : 0) 
    ).DefaultIfEmpty(1).FirstOrDefault()) 
    select new { bq, LastStatus }); 

理想的情況是,你有兩個單獨的查詢,這取決於Status,因爲它在這一點上,右側是否需要還不知道。

+0

你已經救了我,非常感謝你! – Zulander

+0

@Zulander不用擔心:) – Rob