2017-09-15 81 views
-1

我有一個名爲DataList的數據列表。 DataListidUpdatedTime等字段。另一方面,我只有id及其各自的價值UpdatedTime的字典。 有什麼辦法來過濾DataList,使其滿足字典itemIdAndUpdatedTimeFilter項目Id和他們各自的UpdatedTime高於DataListUpdatedTime在LINQ中使用字典Where子句

Dictionary<int, DateTime> itemIdAndUpdatedTimeFilter = getFilter(); 
itemIdAndUpdatedTimeFilter.Add(1, dateA); 
itemIdAndUpdatedTimeFilter.Add(2, dateB); 
itemIdAndUpdatedTimeFilter.Add(3, dateC); 

var dataList = getData(); 

var filtered = dataList.Where(d=>itemIdAndUpdatedTimeFilter.ContainsKey(d.Id) && itemIdAndUpdatedTimeFilter[d.Id] < d.UpdatedTime) 

以上LINQ語句如下異常結束:

LINQ to實體不能識別方法「布爾 的containsKey(Int32)已」的方法,而這種方法不能被翻譯成 一個商店表達。

試圖刪除ContainKey條件和獲得,而不是執行以下操作:

LINQ到實體無法識別方法「的System.DateTime get_Item(Int32)已」的方法,而這種方法不能被翻譯成一個 存儲表達式。

所需的查詢是這樣的:

SELECT FROM dataList 
WHERE (dataList.UpdatedTime < dateA AND dataList.Id = 1) 
OR (dataList.UpdatedTime < dateB AND dataList.Id = 2) 
OR (dataList.UpdatedTime < dateC AND dataList.Id = 3) 
+2

您不能使用字典過濾數據庫表,該表不能轉換爲SQL存儲庫表達式。或者是示例sql只是內存過濾器的可比語法? – Igor

+0

@Igor我明白了,謝謝 –

回答

1

從數據庫中獲取的所有項目和過濾內存結果:

var dataList = getData().ToList(); 
var filtered = dataList.Where(d=>itemIdAndUpdatedTimeFilter.ContainsKey(d.I‌​d) && itemIdAndUpdatedTimeFilter[d.Id] > d.UpdateTime)): 

另一種選擇是執行原SQL或在數據庫中執行篩選的存儲過程:https://msdn.microsoft.com/en-us/library/jj592907(v=vs.113).aspx

實體框架將無法將您的過濾邏輯轉換爲有效的SQL查詢。