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