在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查询?
发布于 2019-09-04 22:11:32
我相信你可以使用Items.Where(x => EF.Functions.Like(x.ItemNumber.ToString(), idPartString);。
在DbFunctions类中,很少有方法可以利用SQL操作符和函数。
更多关于如何根据你的问题在老问题翻译(不是EF核心,但似乎仍然有效)。
更新
SouthShoreAK在评论中添加的有价值的信息。
此外,使用Functions.Like允许您在字符串中间使用通配符,而String.Contains没有使用通配符。
感谢您的分享!
发布于 2019-09-04 22:16:08
虽然第一个表达式更简单,但不太可能更昂贵。两者都需要将所有item_num值转换为varchar来执行比较。第一个简单地有一个隐式转换,而第二个是显式转换。
如果其中任何一个参数不是字符串数据类型,则SQL Server数据库引擎将其转换为字符串数据类型(如果可能的话)。
https://stackoverflow.com/questions/57795962
复制相似问题