EF Core 整数字段有效包含子字符串

Sou*_*eAK 3 sql sql-server entity-framework entity-framework-core

在 SQL Server 数据库表中,我有一个整数 ID 列。这不是主键,更像是序列号。我没有能力更改表定义。

我有一个要求,用户能够搜索部分 ID。例如,“ID 包含‘801’”。

我可以直接执行以下查询:

select * from items
where item_num like '%801%'
Run Code Online (Sandbox Code Playgroud)

在 EF Core 中,我有以下内容:

Items.Where(x => x.ItemNumber.ToString().Contains(idPartString))
Run Code Online (Sandbox Code Playgroud)

这被翻译成:

WHERE ((CHARINDEX(@__idPart_2, CONVERT(VARCHAR(11), [x].[item_num])) > 0) OR (@__idPart_2= N''))
Run Code Online (Sandbox Code Playgroud)

是否有更好(更高效)的方法来实现此目的,而无需诉诸原始 SQL 查询?

dro*_*der 6

我相信你可以使用Items.Where(x => EF.Functions.Like(x.ItemNumber.ToString(), idPartString);

类中很少有方法DbFunctions应该利用 SQL 运算符和函数。

有关如何根据旧问题中的问题进行翻译的更多信息(不是 EF Core,但似乎仍然有效)。

更新

SouthShoreAK在评论中添加了有价值的信息。

此外,使用 Functions.Like 允许您在字符串中间使用通配符,而 String.Contains 则不允许。

感谢分享!

  • 此外,使用“Functions.Like”允许您在字符串中间使用通配符,而“String.Contains”则不允许。 (4认同)
  • 看起来 `x => EF.Functions.Like(x.ItemNumber.ToString(), idPartString` 和 `x => x.ItemNumber.ToString().Contains(idPartString)` 都解析为相同的 SQL 执行计划相同的性能。但是,这更明确,并回答了我的问题。谢谢! (3认同)