多次使用||和&&操作数

时间:2016-11-09 07:18:07

标签: c# entity-framework

我有一个使用Entity Framework的查询。它有许多不同的操作数,我对它的优先级感到困惑。我收到了错误的结果。我需要Item { anchors.fill: parent CheckBox { anchors.centerIn: parent checked: false } } IsPaid == true的所有记录,所有记录都必须是IsPaid == nullTypeId == 1,也必须是TypeId == 2CityId == 1。出于某种原因,它不会评估CategoryId == 2CityId。 我究竟做错了什么?感谢。

CategoryId

4 个答案:

答案 0 :(得分:28)

解决此问题的最佳方法是使用括号。 即使您知道绑定优先级,也应始终使用它们,以提高代码的可读性。

(x.IsPaid == true || x.IsPaid == null) && (x.TypeId == 1 || x.TypeId == 2) && x.CityId == 1 && x.CategoryId == 2


&&的合规性高于||

因此false && false || true会被翻译为(false && false) || true => true


@Joey提到的旁注:

而不是(x.IsPaid == true || x.IsPaid == null),您可以写(x.IsPaid != false)

答案 1 :(得分:9)

由于operator precedence&&的绑定高于||

如果您将Where语句链接起来,则会更清楚会发生什么:

var list = db.Ads
          .Where(x => x.IsPaid == true || x.IsPaid == null)
          .Where(x=> x.TypeId == 1 || x.TypeId == 2)
          .Where(x=> x.CityId == 1)
          .Where(x=> x.CategoryId == 2)
          .ToList();

答案 2 :(得分:4)

&&的优先级高于||,就像在数学中一样。所以,有效的条件如下:

x.IsPaid == true ||
x.IsPaid == null && x.TypeId == 1 ||
x.TypeId == 2 && x.CityId == 1 && x.CategoryId == 2

如果单独行中的任何表达式为真,则整个表达式为真。你必须在这里用括号来澄清:

(x.IsPaid == true || x.IsPaid == null) &&
(x.TypeId == 1 || x.TypeId == 2) &&
 x.CityId == 1 &&
 x.CategoryId == 2

答案 3 :(得分:1)

试试这个:

var list = db.Ads.Where (
            (x => x.IsPaid == true || x.IsPaid == null) && 
            (x.TypeId == 1 || x.TypeId == 2) && 
            (x.CityId == 1 && x.CategoryId == 2)
).ToList();