当传递谓词时,实体框架返回不同的结果

本文关键字:返回 结果 框架 实体 谓词 | 更新日期: 2023-09-27 18:11:21

string personName= "JoHn";  
//(in my table iam already having a person named='john')
Func<Person, bool> predicate = (p) => p.Name== personName;
var res2 = dataContext.Persons.Any(predicate);                //returns false
var res1 = dataContext.Persons.Any(p=>p.Name== personName);   // returns true

我认为有谓词它考虑personName性质的case,而没有谓词它只是忽略case

有谁知道为什么吗?

当传递谓词时,实体框架返回不同的结果

Func<Page, bool>是一个委托,这意味着你在LINQ-to-Objects中运行它(即在内存中,在c#中). . net字符串大小写敏感的,所以这将适用于大小写。

这个版本,然而:

var res1 = dataContext.Persons.Any(p=>p.Name== personName); 

使用IQueryable<T>和表达式树;它将作为TSQL过滤器执行,它将应用数据库规则。这里发生的事情取决于您的DB是如何配置的(它可以是区分大小写的,也可以是不区分大小写的,这取决于数据库)。

如果您希望它们都使用相同的逻辑,那么请注意这里的区别:

Expression<Func<Page, bool>> predicate = (p) => p.Name== personName;
var res2 = dataContext.Persons.Any(predicate);

Expression<...>的添加使其成为表达式树,而不是委托,因此它被"组合"并在数据库中执行(通过TSQL转换),与

完全相同:
var res1 = dataContext.Persons.Any(p=>p.Name== personName);