【发布时间】:2025-12-29 02:00:12
【问题描述】:
考虑以下Person 实体:
public class Person
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
使用以下Expression(使用PredicateBuilder构造)作为条件:
var byName = PredicateBuilder.True<Person>().And(x => x.FirstName == "Chaim");
使用以下语法调用时,生成的 SQL 很好(包括 WHERE 语句):
ctx.Set<Person>().AsExpandable().Where(x => byName.Invoke(x));
但是,当使用这种略有不同的语法调用时,不涉及 SQL WHERE,而是由 Enumerable.Where 完成过滤:
ctx.Set<Person>().AsExpandable().Where(byName.Invoke);
有什么想法吗?
【问题讨论】:
-
这是非常危险的。我打电话给
Where(expression.Compile())而不是Where(x => expression.Invoke(x))。然后,在跟踪我们的生产数据库是否很糟糕时,我看到了select [every column] from Table;没有 where 子句。前者来自文档!
标签: c# linq linq-to-entities entity-framework-6 linqkit