【问题标题】:Using Custom Extension Methods inside LinQ (Compare two strings)在 LinQ 中使用自定义扩展方法(比较两个字符串)
【发布时间】:2021-02-03 06:13:07
【问题描述】:

我想为 LinQ 创建一个简化的比较器。这是我当前的代码。

DBContext.product_type
                    .Where(x => x.name.ToLower()(filter.ToLower()) 
                        || x.description..ToLower()(filter.ToLower()) 
                        || x.online_category.description..ToLower()(filter.ToLower()))

我想使用 linQ 扩展方法来简化它。到目前为止,这就是我得到的。

DBContext.product_type
                    .Where(x => x.name.CompareToLower(filter) 
                        || x.description.CompareToLower(filter) 
                        || x.online_category.description.CompareToLower(filter))
public static bool CompareToLower(this string str, string comparer)
{
    if (str.ToLower().Contains(comparer.ToLower()))
    {
        return true;
    }
    else
    {
        return false;
    }
}

这是我遇到的错误

linq to Entities 无法识别方法 'Boolean CompareToLower(System.String, System.String)' 方法,并且该方法无法转换为存储表达式。

【问题讨论】:

  • 正如错误消息所说,CompareToLower 无法转换为 SQL 查询。 EF 中的 C# LINQ 查询最终会转换为 SQL 查询并针对数据库运行以检索数据。您应该将filter.ToLower() 存储到某个变量中,并直接在LINQ 中对列名使用ToLower()Contains 方法,而不是创建扩展方法。 .Where(x => x.name.ToLower().Contains(lowerFilter)
  • 不错的主意。谢谢你。
  • 您是否为区分大小写的排序规则设置了 sql?默认情况下,SQL 会进行不区分大小写的搜索。在这种情况下,您根本不需要ToLower
  • 是的,我设置了区分大小写的排序规则
  • @whizzle 那是个坏主意。将其更改为区分大小写。您显然需要区分大小写的比较,因此使用区分大小写的排序规则没有意义。如果您每次都必须转换为小写,则您的查询将无法使用任何索引,从而强制进行全表扫描。除了最小的桌子之外,这对于任何东西来说都是非常昂贵的

标签: c# entity-framework linq


【解决方案1】:

这样的扩展方法无法转换为 SQL Query。

@meysamasadi 提供的答案会起作用,但会获取您的整个表格并在客户端进行比较。

如果您希望在数据库端进行比较,最有效的方法是将排序规则更改为不区分大小写(如 cmets 中所建议的那样)。

您也可以使用以下代码:

DBContext.product_type
    .Where(x => 
        EF.Functions.Like(x.Name, filter) 
        || EF.Functions.Like(x.Description, filter) 
        || EF.Functions.Like(x.online_category.description, filter))

** 请注意,使用上述方法,您还可以在过滤器和模式中包含通配符 https://docs.microsoft.com/en-us/dotnet/api/microsoft.entityframeworkcore.dbfunctionsextensions.like?view=efcore-5.0

【讨论】:

    猜你喜欢
    • 2022-06-15
    • 1970-01-01
    • 1970-01-01
    • 2011-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-25
    • 2012-12-01
    相关资源
    最近更新 更多