Lambda表达式和||实体框架中的运算符

时间:2013-05-16 20:46:48

标签: 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();

下面的代码无效

string category = null;
Category Category = null;
int categoryId = 0;

var products = repository.Products
    .Where(p => category == null || p.CategoryID == Category.CategoryID)
    .ToList();

我知道问题是即使我正在使用||操作员 - 它不像我想的那样工作。

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

1 个答案:

答案 0 :(得分:16)

您的“OR”将作为SQL发送到数据库。实体框架必须评估 Category才能构造发送到数据库的正确SQL。在您的第一个示例中,您没有向Entity Framework提供相同的问题。这不是短路问题,而是将表达式(包括OR)翻译成正确的查询。

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