【问题标题】:C# - filtering collection based on another collection exceptionC# - 基于另一个集合异常过滤集合
【发布时间】:2021-04-16 08:48:51
【问题描述】:

我搜索了很多关于如何根据另一个集合过滤集合的示例,我找到了一种简单的方法,如下所示:

var oShipnotes = await DbContext.ShipNotes.Where(s => oManageRouteDto.ShipNotes.Any(mr => mr.Id == s.Id)).ToListAsync();

但是它抛出一个异常,说它不能被翻译成 SQL 查询。

谁能指出正确的方向如何解决这个问题? 谢谢!

【问题讨论】:

  • 你能显示完整的异常信息吗?
  • 什么版本的 Net/Core?并非所有网络查询都适用于 Core。

标签: c# linq collections filtering


【解决方案1】:

将嵌套的 LINQ 查询替换为标识符的具体化列表:

// 1) get the list of target ship note identifiers
var ids = oManageRouteDto.ShipNotes.Select(mr => mr.Id).ToList();

// 2) pass this list into Where using Contains
var oShipnotes = await DbContext.ShipNotes.Where(s => ids.Contains(s.Id)).ToListAsync();

EF 知道这种模式并将IList<T>.Contains 转换为SQL 的IN 条件。

由于 EF 处理 IQueryables,每个 LINQ 查询都必须转换为有效的 SQL 表达式。因此,EF 和底层提供程序无法仅仅因为 SQL 不是 C# 而翻译每个有效的 LINQ 查询(从 C# 的角度来看)。

【讨论】:

  • 感谢@Dennis 的快速回答,就像一个魅力!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-27
  • 2015-07-21
  • 2022-01-19
  • 2018-12-11
  • 1970-01-01
  • 2015-03-06
  • 2010-10-17
相关资源
最近更新 更多