【发布时间】: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 中没有这样做的实际代码。任何帮助/见解将不胜感激