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

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

概述我很惊讶,这段代码工作: 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 == 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,并且您的问题出现.

总结

以上是内存溢出为你收集整理的c# – Lambda表达式和||实体框架中的运算符全部内容,希望文章能够帮你解决c# – Lambda表达式和||实体框架中的运算符所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1260194.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存