【问题标题】:entity framework returning different result when predicate is passed传递谓词时实体框架返回不同的结果
【发布时间】:2011-12-09 02:59:03
【问题描述】:
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。

有人知道为什么吗??

【问题讨论】:

    标签: c# linq entity-framework linq-to-entities entity-framework-4.1


    【解决方案1】:

    Func&lt;Page, bool&gt; 是一个委托,这意味着您在 LINQ-to-Objects 中运行它(即在内存中,在 C# 中)。 .NET 字符串区分大小写,因此这将适用大小写。

    但是这个版本:

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

    正在使用IQueryable&lt;T&gt; 和表达式树;它将作为 TSQL 过滤器执行,它将应用数据库规则。此处发生的情况取决于您的数据库的配置方式(它可能区分大小写或不区分大小写,具体取决于数据库)。

    如果您希望它们都使用相同的逻辑,请注意此处的区别:

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

    添加Expression&lt;...&gt; 使其成为表达式树,而不是委托,因此它是“组合”并在数据库中执行(通过TSQL 翻译) ,完全一样:

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

    【讨论】:

    • 我已经知道答案了,我只是在检查是否有人知道这一点-> 开个玩笑。
    猜你喜欢
    • 2021-10-15
    • 2020-09-09
    • 1970-01-01
    • 2011-12-16
    • 1970-01-01
    • 1970-01-01
    • 2015-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多