加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 06:55:11 所属栏目:百科 来源:网络整理
导读:我很惊讶,这段代码工作: string category = null;Category Category = null;int categoryId = 0;var products = repository.Products .Where(p = category == null || p.CategoryID == categoryId) .ToList(); 但下面的代码失败: string category = null;C
我很惊讶,这段代码工作:
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();

我知道问题是,即使我使用||运算符 – 它不会像我想象的那样工作.

在第二个示例中为什么要查看类别 – 即使类别值为null.不会短路吗?

解决方法

您的“OR”作为SQL发送到数据库.实体框架必须评估类别,以便构造发送到数据库的适当的SQL.在你的第一个例子中,你没有给实体框架那样的问题.这不是短路的问题,而是将您的表达式(包括OR)转换为适当的查询.

要清楚:如果您的查询发生在Linq-to-Objects的内存中(作为示例),则您希望可以短路并避免解除引用null将是正确的.但不是.整个表达式被转换为SQL,这意味着它需要评估Category(您已初始化为null)以获取CategoryID,并且您的问题出现.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读