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

Igo*_*hov 15 c# entity-framework

我有一个使用Entity Framework的查询.它有许多不同的操作数,我对它的优先级感到困惑.我收到了错误的结果.我需要所有记录,IsPaid == true或者IsPaid == null所有记录必须是,TypeId == 1或者TypeId == 2也必须是CityId == 1CategoryId == 2.由于某种原因,它没有评估CityIdCategoryId.我究竟做错了什么?谢谢.

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();
Run Code Online (Sandbox Code Playgroud)

Tim*_*idt 28

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

(x.IsPaid == true || x.IsPaid == null) && (x.TypeId == 1 || x.TypeId == 2) && x.CityId == 1 && x.CategoryId == 2
Run Code Online (Sandbox Code Playgroud)


&& 比...更高的亲和力 ||

因此,false && false || true将被转换为(false && false) || true=> true


联盟论坛由@Joey提到:

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

  • 你是对的,'&&`的优先级高于`||`,但我建议总是使用括号,所以代替'A && B || C',我建议写'(A && B)|| C`.虽然它意味着完全相同,但它通过消除可能的疑虑大大提高了可读性. (10认同)

Tho*_*ler 9

由于运算符优先级,&&绑定高于||.

如果你链接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();
Run Code Online (Sandbox Code Playgroud)