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

本文关键字:运算符 表达式 Lambda 框架 实体 | 更新日期: 2023-09-27 18:14:14

我很惊讶这段代码居然能工作:

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

我知道问题是,即使我使用了||运算符——它也不像我想象的那样工作。

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

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

您的"OR"作为SQL被发送到数据库。实体框架必须评估 Category,以便构造发送到数据库的正确SQL。在你的第一个例子中,你没有给实体框架同样的问题。这不是短路的问题,而是将表达式(包括OR)翻译成正确的查询。

要清楚:如果您的查询发生在内存中的链接到对象(作为一个例子),您的期望,它可以短路和避免解引用null将是正确的。但事实并非如此。整个表达式被翻译成SQL,这意味着它需要计算Category(您已将其初始化为null)以获得CategoryID,这时问题就出现了。