9

我很惊讶这段代码有效:

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();

我知道问题是即使我使用 || 操作员——它并不像我想象的那样工作。

在第二个示例中,为什么要查看类别——即使类别值为空。不会短路吗?

4

1 回答 1

16

您的“OR”作为 SQL 被发送到数据库。实体框架必须进行评估 Category才能构建发送到数据库的正确 SQL。在您的第一个示例中,您没有给实体框架带来同样的问题。这不是短路的问题,而是将您的表达式(包括 OR)转换为正确的查询的问题。

需要明确的是:如果您的查询发生在 Linq-to-Objects 的内存中(例如),那么您期望它可以短路并避免取消引用 null 是正确的。但事实并非如此。整个表达式正在被转换为 SQL,这意味着它需要评估 Category(您已将其初始化为 null)以获取 CategoryID,然后您的问题就出现了。

于 2013-05-16T20:51:35.737 回答