首页 > 解决方案 > Net core EF 3.1 LINQ 字符串比较不再起作用

问题描述

我有以下课程:

public class Employee
{
    public string Name {get; set;}
    ...
}

和 EF Core 2.1 中的 LINQ 查询

Employee GetEmployeeByName(string name) {
  return Context.Employee.Where ( w =>String.Compare(w.Name, name, true) == 0).FirstOrDefault();
}

转成Net Core EF 3.1后出现错误。

无法翻译 LINQ 表达式。要么以可翻译的形式重写查询,要么通过插入对 、 、 或 的调用显式切换到AsEnumerable()客户AsAsyncEnumerable()ToList()评估ToListAsync()

我必须将查询更改为

Employee GetEmployeeByName(string name) {
  return Context.Employee.Where ( w =>w.Name.ToLower() == name.ToLower()).FirstOrDefault();
}

有一个更好的方法吗?

标签: c#linqentity-framework-coreef-core-3.1

解决方案


如果您在进行不区分大小写的字符串比较,建议 (AFAIK) 是使用EF.Functions扩展,它将转换为正确的 SQL 语句。

你的例子变成了这个(使用Like):

using Microsoft.EntityFrameworkCore;

Employee GetEmployeeByName(string name) {
  return Context.Employee.Where(w => EF.Functions.Like(w.Name, name)).FirstOrDefault();
}

这转化为类似的东西(取决于服务器版本)

SELECT TOP(1) <<list of fields here>> FROM Employee WHERE Name LIKE(@name)

可用的功能取决于 EF Core 和底层 DBMS 的版本,但由于您提到了 SQL Server,假设您使用“默认”排序规则,上述内容将起作用。相关:LIKE 运算符对 MSSQL Server 是否区分大小写?


推荐阅读