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
我认为谓词考虑case
personName
属性,而没有它只是忽略case
。
任何人都知道为什么??
答案 0 :(得分:7)
Func<Page, bool>
是一个委托,这意味着你在LINQ-to-Objects中运行它(即在内存中,在C#中)。 .NET字符串 区分大小写,因此这将适用大小写。
但是这个版本:
var res1 = dataContext.Persons.Any(p=>p.Name== personName);
正在使用IQueryable<T>
和表达式树;它将作为TSQL过滤器执行,它将应用数据库规则。这里发生的事情取决于您的数据库配置方式(可能是区分大小写或不区分大小写,具体取决于数据库)。
如果你想让他们两个都使用相同的逻辑,那么请注意这里的区别:
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);