【问题标题】:Entity Framework Core to SQL Server IN ClauseEntity Framework Core 到 SQL Server IN 子句
【发布时间】:2019-03-15 13:48:13
【问题描述】:

我们正在从 LINQ 转换为 SQL 到 Entity Framework Core 2.2,并发现包含操作的转换不会成为 SQL Server 中的 IN 子句。正在发生的事情是 EF Core 正在使用其他条件拉回所有数据,然后在本地对其进行过滤。这是不可接受的。我们可以使用 EF.Functions.Contains 但这需要我们在 SQL Server 中启用全文搜索,这太过分了。

知道如何将如下语句转换为 SQL Server 中的 IN 子句吗?

var myValues = new [] { 1, 2, 3, 4, 5 };
var qry = _context.Table.Where(t => myValues.Contains(t.TableProperty));

好的,也许我过度简化了代码以保持问题的简单性。实际代码如下:

voterQuery = voterQuery.Where(v => voterFilter.VoterStatus.Select(p => p.Value).Contains(v.VotStatus.ToString()));

在我们的代码中发生的情况是,我们正在根据过滤屏幕上的用户选择构建一个IQueryable。 voterFilters 包含这些选择标准的集合。 VoterStatus 是 List<CheckedListItem> 的选择标准之一,它来自 Winforms CheckedListItems 控件。

p.Value 的选择返回一个字符串列表。我试图将字符串列表投影到一个数组中,与未创建 IN 子句或服务器查询的结果相同。也许,EF Core 不允许将字符串用于 IN 子句值。任何见解将不胜感激。

【问题讨论】:

  • 有问题的查询确实转换为 SQL IN。您需要显示实际有问题的查询,因为还有其他因素可能会导致客户评估。
  • 我已经编辑了代码以包含在 LINQ to SQL 中创建 IN 子句但在 EFCore 中没有这样做的实际代码。任何帮助/见解将不胜感激

标签: c# entity-framework-core


【解决方案1】:

目前(从 v2.2.3 开始),EF Core 要求用于 Contains 的表达式是一个简单的 IEnumerable<T> 变量(无 LINQ 运算符),其中 T 是原始类型。

这意味着您需要将voterFilter.VoterStatus.Select(p => p.Value) 移动到查询表达式树之外的变量中并在内部使用该变量:

var voterStatusFilter = voterFilter.VoterStatus.Select(p => p.Value);
voterQuery = voterQuery.Where(v => voteStatusFilter.Contains(v.VotStatus.ToString()));

【讨论】:

  • 谢谢伊万。你的推荐作品。脚手架代码将属性创建为字符串而不是字符,这使问题更加复杂,这实际上是底层 SQL 数据的内容。当我将模型更改为 VoterStatus 的字符时,查询转换为 SQL Server IN 子句。生活和学习。
猜你喜欢
  • 2017-05-07
  • 1970-01-01
  • 2017-10-19
  • 1970-01-01
  • 2020-05-29
  • 2018-09-02
  • 1970-01-01
  • 2017-12-27
  • 2021-06-03
相关资源
最近更新 更多