我有一个名为 accessories
的 bool 条件
如果为真,那么我想确保单元格值不为空 否则它可以是空的。我有以下内容:
var items = (from a in allRowsrows
where accessories == true ? a["MASTERID"].ToString() != "": a["MASTERID"].ToString() == "" &&
a["ITEMNO"].ToString() != a["NEWITEMNO"].ToString() ||
a["LABEL"].ToString() != a["NEWVISITEMNO"].ToString()
select new ItemsToUpdate
{
isAccessory = accessories,
Item = a
}
).ToList();
问题: 好吧,简单地说,使用上面的方法时它不能正确过滤。
ITEMNO cell, `NEWITEMNO` cell are the same , LABEL cell and `NEWVISITEMNO` cell are also the same
然后这应该会给我一个包含 0 个项目的列表,但我的列表中仍然有项目。
我做错了什么?
编辑:
修改后的代码:
var items = (from a in allRows
where accessories == true ? a["MASTERID"].ToString() != "": true &&
(a["ITEMNO"].ToString() != a["NEWITEMNO"].ToString()) ||
(a["LABEL"].ToString() != a["NEWVISITEMNO"].ToString())
select new ItemsToUpdate
{
isAccessory = accessories,
Item = a
}
).ToList();
还是过滤错误。
最佳答案
这就是您没有得到正确结果的原因。这种情况:
where accessories == true ? a["MASTERID"].ToString() != "": a["MASTERID"].ToString() == "" &&
a["ITEMNO"].ToString() != a["NEWITEMNO"].ToString() ||
a["LABEL"].ToString() != a["NEWVISITEMNO"].ToString()
意思是:
如果 accessories 为真,则检查 MASTERID 是否不为空。这就对了。但是,这就是错误所在,如果配件是假的,请检查下面的整个情况:
a["MASTERID"].ToString() == "" &&
a["ITEMNO"].ToString() != a["NEWITEMNO"].ToString() ||
a["LABEL"].ToString() != a["NEWVISITEMNO"].ToString()
这样计算的:
(a["MASTERID"].ToString() == "" &&
a["ITEMNO"].ToString() != a["NEWITEMNO"].ToString()
)
OR
a["LABEL"].ToString() != a["NEWVISITEMNO"].ToString()
换句话说,如果MASTERID为空且ITEMNO与NEWITEMNO不同,则永远不会检查LABEL。 您在问题中编辑的代码没有任何区别,它仍然与上面的意思相同。
现在您的问题是,为什么 Enigmativity 的答案会给您正确的结果。他是这样的:
where accessories ? a["MASTERID"].ToString() != "" : true
where a["ITEMNO"].ToString() != a["NEWITEMNO"].ToString() || a["LABEL"].ToString() != a["NEWVISITEMNO"].ToString()
这意味着:
如果 accessories 为真,则检查 MASTERID 是否不为空。否则使用值 true
。此外,检查以确保 ITEMNO 与 NEWITEMNO 不同或 LABEL 与 NEWVISITITEMNO 不同。
所以本质上它是这样做的:
(accessories ? a["MASTERID"].ToString() != "" : true)
&&
(
a["ITEMNO"].ToString() != a["NEWITEMNO"].ToString() ||
a["LABEL"].ToString() != a["NEWVISITEMNO"].ToString()
)
我不知道您的全部要求,但恐怕即使是 Enigmativity 的回答也可能会产生错误的结果(或可能不会)。这完全取决于您何时会遇到具体情况。也许,我的解释可以为您提供指导。
关于c# - 如何使用linq在where子句中设置条件过滤器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52760428/