2013-08-01 49 views
0

我有一個問題與LINQ包含到SQL查詢,如下:傳遞null爲包含()內「的LINQ to SQL」查詢

public IAuditRecord[] Fetch(SearchConditions searchConditions) 
    { 
     IAuditRecord[] searchedList = (from rows in _dbContex.AuditTrails 
             where 
             (searchConditions.Owner == null || searchConditions.Owner == 0) ? true : rows.Owner == searchConditions.Owner 
             && 
             /*This line cannot compile when ActionIDs array is empty*/ 
             (searchConditions.ActionIDs != null && searchConditions.ActionIDs.Length != 0) ? searchConditions.ActionIDs.Contains(rows.UserActionID) : true 
             && ((searchConditions.StartDate != null && searchConditions.EndDate != null) ? (rows.TimeStamp >= searchConditions.StartDate && rows.TimeStamp <= searchConditions.EndDate) 
             : (searchConditions.StartDate != null && searchConditions.EndDate == null) ? rows.TimeStamp >= searchConditions.StartDate : (searchConditions.StartDate == null && searchConditions.EndDate != null) ? (rows.TimeStamp <= searchConditions.EndDate) 
             : true) 
             select rows).ToArray(); 
     return searchedList; 
    } 

該查詢執行完美如果searchCondition.ActionIDs陣列不爲空或空, 但是當我傳遞ActionIDs數組爲空查詢無法編譯。

所以主要問題是爲什麼包含ActionIDs數組爲空時無法工作?

+1

嗯,一切似乎就在乍看之下。我可能會建議的一件事就是對規範模式進行一些研究。用於過濾記錄的謂詞(例如where子句)在閱讀和理解的過程中非常複雜,而沒有真正考慮它。通過創建一些規範,您可以極大地提高代碼的可讀性並減輕調試工作(您可能知道哪個規範失敗了)。 – fourpastmidnight

+2

它爲什麼會起作用?調用對象設置爲null的任何函數應該會導致一個'NullReferenceException' – Magnus

+0

因爲他正在檢查null:'searchConditions.ActionIDs!= null'。 – fourpastmidnight

回答

0

您正在構建一個IQueryable,它定義了如何查詢某些內容,而不是實際執行此操作。爲此,它生成一個Expression,它定義了所有的查詢意圖,並可以稍後調用以實際獲取數據。如果你使用的是LINQ到對象,這可能會起作用,因爲它可能會首先調用searchConditions.ActionIDs != null,然後知道它不必嘗試執行第二部分。 Linq-to-Entities/SQL等沒有這種好處。

長話短說,你可以這樣做:

searchConditions.ActionIDs = searchConditions.ActionIDs ?? new int[]; 

或者其無效,像做了不同的查詢:

var query = _dbContext.AuditTrails; 

if(searchConditions.ActionIDs != null && searchCondition.ActionIDs.Length != 0) 
{ 
    query = // Further filtered query where ActionIDs are taken into account. 
+0

這已經是我的最後一個解決方案,但我接受了你的回答,「new int []」必須改爲「new int [] {}」:-),謝謝你。 – Aria