c# - 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();
}
有一个更好的方法吗?
解决方案
如果您在进行不区分大小写的字符串比较,建议 (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 是否区分大小写?
推荐阅读
- java - 如何分组为数组映射?
- node.js - 如何根据请求散列和下载图像?
- c - C中结构内的结构
- gremlin - 使用类型间接连接顶点
- angular - Angular:具有管理后端的应用程序的正确项目结构
- sprite-kit - Spritekit 物理销毁对象动画
- apache-spark - Azure HDInsight 的 SparkRunner 上的 Apache Beam 管道
- javascript - 为什么这个最低公分母函数对于更高的数值输入返回未定义
- perl - 在 FASTQ 中合并具有不同标题顺序的 Fasta 和 Qual 文件
- elm - 如何使用 elm-bootstrap 4.1.0 制作条纹表?