繁体   English   中英

在 LinQ 中使用自定义扩展方法(比较两个字符串)

[英]Using Custom Extension Methods inside LinQ (Compare two strings)

我想为 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 到 Entities 无法识别方法 'Boolean CompareToLower(System.String, System.String)' 方法,并且此方法无法转换为存储表达式。

像这样的扩展方法不能转换为 SQL 查询。

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

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

作为替代方案,您可以使用以下代码:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM