ek_*_*_ny 9 c# linq entity-framework
我很惊讶这段代码有效:
string category = null;
Category Category = null;
int categoryId = 0;
var products = repository.Products
.Where(p => category == null || p.CategoryID == categoryId)
.ToList();
Run Code Online (Sandbox Code Playgroud)
但是下面的代码失败了:
string category = null;
Category Category = null;
int categoryId = 0;
var products = repository.Products
.Where(p => category == null || p.CategoryID == Category.CategoryID)
.ToList();
Run Code Online (Sandbox Code Playgroud)
我知道问题是即使我正在使用|| 操作员 - 它不像我想的那样工作.
在第二个示例中,为什么要查看类别 - 即使类别值为空.它不会被短路吗?
Ant*_*ram 16
您的"OR"将作为SQL发送到数据库.实体框架必须进行评估 Category
才能构造发送到数据库的正确SQL.在您的第一个示例中,您没有向Entity Framework提供相同的问题.这不是短路问题,而是将表达式(包括OR)转换为正确的查询.
要明确的是:如果你的查询是在Linq-to-Objects的内存中发生的(作为一个例子),你期望它可以短路并避免解除引用null是正确的.但事实并非如此.整个表达式被转换为SQL,这意味着它需要评估Category(已初始化为null)以获取CategoryID,并且您的问题就出现了.
归档时间: |
|
查看次数: |
4750 次 |
最近记录: |