【问题标题】:EF Core integer field contains substring efficientlyEF Core 整数字段有效地包含子字符串
【发布时间】:2020-01-07 19:03:34
【问题描述】:

在 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 查询?

【问题讨论】:

    标签: sql sql-server entity-framework entity-framework-core


    【解决方案1】:

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

    DbFunctions 类中的一些方法应该利用 SQL 运算符和函数。

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

    更新

    SouthShoreAK在评论中添加的宝贵信息。

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

    感谢分享!

    【讨论】:

    • 看来x => EF.Functions.Like(x.ItemNumber.ToString(), idPartStringx => x.ItemNumber.ToString().Contains(idPartString) 都解析为具有相同性能的相同SQL 执行计划。但是,这更明确,并回答了我的问题。谢谢!
    • 另外,使用Functions.Like 允许您在字符串中间使用通配符,而String.Contains 则不能。
    【解决方案2】:

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

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

    LIKE

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-19
      • 2017-11-16
      • 1970-01-01
      • 2019-01-17
      相关资源
      最近更新 更多