我很惊讶这段代码有效:
string category = null;
Category Category = null;
int categoryId = 0;
var products = repository.Products
.Where(p => category == null || p.CategoryID == categoryId)
.ToList();
但下面的代码无效:
string category = null;
Category Category = null;
int categoryId = 0;
var products = repository.Products
.Where(p => category == null || p.CategoryID == Category.CategoryID)
.ToList();
我知道问题是即使我正在使用||操作员 - 它不像我想的那样工作。
在第二个示例中,为什么要查看类别 - 即使类别值为空。它不会被短路吗?
答案 0 :(得分:16)
您的“OR”将作为SQL发送到数据库。实体框架必须评估 Category
才能构造发送到数据库的正确SQL。在您的第一个示例中,您没有向Entity Framework提供相同的问题。这不是短路问题,而是将表达式(包括OR)翻译成正确的查询。
要明确:如果您的查询发生在Linq-to-Objects的内存中(作为示例),您期望它可以短路并避免取消引用null将是正确的。但事实并非如此。整个表达式被转换为SQL,这意味着它需要评估Category(已初始化为null)以获取CategoryID,并且您的问题就出现了。