【发布时间】: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