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



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

我要求用户能够搜索部分 ID。例如,"ID 包含'801'"。

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

select * from items
where item_num like '%801%'

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

Items.Where(x => x.ItemNumber.ToString().Contains(idPartString))

翻译成:

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

有没有更好(性能更高(的方法来实现这一点,而无需诉诸原始SQL查询?

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

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

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

更新

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

此外,使用 Functions.Like 允许您在中间使用通配符 的字符串,而 String.包含没有。

感谢分享!

虽然第一个表达式更简单,但它不太可能更昂贵。 两者都需要将所有item_num值转换为 varchar 才能进行比较。 第一个只是隐式转换,而第二个是显式转换。

如果任何一个参数不是字符串数据类型,则 SQL Server 数据库引擎将其转换为字符串数据类型, 如果可能的话。

喜欢

最新更新