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

Rus*_*ova 4 c# linq linq-to-entities entity-framework entity-framework-4.1

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
Run Code Online (Sandbox Code Playgroud)

我认为,谓词考虑casepersonName财产,而没有它只是无视case.

谁知道为什么?

Mar*_*ell 7

A Func<Page, bool>是委托,这意味着您在LINQ-to-Objects(即在内存中,在C#中)运行它..NET字符串大小写敏感的,所以这将适用情况.

但是这个版本:

var res1 = dataContext.Persons.Any(p=>p.Name== personName); 
Run Code Online (Sandbox Code Playgroud)

正在使用IQueryable<T>和表达树; 它将作为TSQL过滤器执行,它将应用数据库规则.这里发生的事情取决于您的数据库配置方式(可能是区分大小写或不区分大小写,具体取决于数据库).

如果你想让他们都使用相同的逻辑,那么请注意这里的区别:

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

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

var res1 = dataContext.Persons.Any(p=>p.Name== personName);
Run Code Online (Sandbox Code Playgroud)