【问题标题】:Using dictionary in LINQ Where clause [duplicate]在 LINQ Where 子句中使用字典 [重复]
【发布时间】:2017-09-15 14:58:49
【问题描述】:

我有一个名为DataList 的数据列表。 DataList 具有字段 idUpdatedTime 以及其他一些字段。另一方面,我有一本只有id 及其各自值UpdatedTime 的字典。 有什么方法可以过滤 DataList 使其满足字典 itemIdAndUpdatedTimeFilter 项 ID 并且它们各自的 UpdatedTime 高于 DataListUpdatedTime

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 Entities 无法识别“Boolean”方法 ContainsKey(Int32)' 方法,该方法不能翻译成 商店表达式。

尝试删除 ContainKey 条件并改为获取以下内容:

LINQ to Entities 无法识别方法“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)

【问题讨论】:

  • 您不能使用字典来过滤数据库表,它不能翻译成 sql 存储表达式。还是示例 sql 只是内存过滤器的可比较语法?
  • @Igor 我明白了,谢谢

标签: c# sql performance linq dictionary


【解决方案1】:

从数据库中获取所有项目并过滤 in-memory 结果:

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

Entity Framework 将无法将您的过滤逻辑转换为有效的 SQL 查询。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-28
    • 2015-08-27
    • 2021-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多