структура сущности, возвращающая другой результат при передаче предиката - PullRequest
4 голосов
/ 17 октября 2011
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.

Кто-нибудь знает почему ??

1 Ответ

7 голосов
/ 17 октября 2011

A 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);
...