c# - Entity Framework 在传递谓词时返回不同的结果

标签 c# linq entity-framework linq-to-entities 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

我认为使用谓词它会考虑 personName 属性的 case 而没有它它只是忽略 case

有人知道为什么吗?

最佳答案

A Func<Page, bool>是一个委托(delegate),这意味着您正在 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<...>使它成为一个表达式树,而不是一个委托(delegate),因此它是“组合”并在数据库中执行的(通过 TSQL 转换),与以下内容完全相同:

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

关于c# - Entity Framework 在传递谓词时返回不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7791203/

相关文章:

c# - lambda 表达式中的空值 - Entity Framework

c# - 具有从同一数据库中的基础 DbContexts 进行多次迁移和继承的 Entity Framework

c# - AutoMapper - 为什么使用 Map 而不是 DynamicMap?

c# - 在 Windows Phone 7 上的 ShellTile 上解析 URI 参数

c# - LINQ 中的升序/降序 - 可以通过参数更改顺序吗?

c# - LINQ - IEnumerable.ToList() 和延迟执行混淆

linq - 使用 Linq 过滤不同的选项和最新日期

c# - 需要一个接受实体 ID 并包含的通用 EF 方法

C# mvc2 在代码中创建纯文本电子邮件

c# - 如何使用兼容Android的C#读写NDEF格式的NFC标签?