4
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實體框架時謂語傳遞

任何人都知道爲什麼?

回答

7

A Func<Page, bool>是一個委託,這意味着你正在LINQ到對象(即在內存中,在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); 
+0

我已經知道了答案,我只是檢查任何人知道這個或不是 - >只是在開玩笑。 –

+0

thanx它的工作。 –