Net core EF 3.1 LINQ 字符串比较不再起作用

use*_*695 9 c# linq entity-framework-core ef-core-3.1

我有以下课程:

public class Employee
{
    public string Name {get; set;}
    ...
}
Run Code Online (Sandbox Code Playgroud)

以及 EF Core 2.1 中的 LINQ 查询

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

转换为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();
}
Run Code Online (Sandbox Code Playgroud)

有一个更好的方法吗?

Tie*_* T. 9

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

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

using Microsoft.EntityFrameworkCore;

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

这翻译成类似的东西(取决于服务器版本)

SELECT TOP(1) <<list of fields here>> FROM Employee WHERE Name LIKE(@name)
Run Code Online (Sandbox Code Playgroud)

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