在LINQ Where子句中使用字典

时间:2017-09-15 14:58:49

标签: c# sql performance linq dictionary

我有一个名为DataList的数据列表。 DataList有字段idUpdatedTime以及其他一些字段。另一方面,我的字典只有id及其各自的值UpdatedTime。 有没有办法过滤DataList,使其满足字典itemIdAndUpdatedTimeFilter项目ID,并且它们各自的UpdatedTime高于DataList的{​​{1}}?

UpdatedTime

上述LINQ语句最终出现在以下异常中:

  

LINQ to Entities无法识别方法'布尔值   ContainsKey(Int32)'方法,这个方法无法翻译成   商店表达。

尝试删除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 to Entities无法识别方法'System.DateTime   get_Item(Int32)'方法,并且此方法无法转换为   商店表达。

所需的查询是这样的:

ContainKey

1 个答案:

答案 0 :(得分: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查询。

相关问题