C# 如何使用linq在where子句中设置条件筛选器?
我有一种叫做C# 如何使用linq在where子句中设置条件筛选器?,c#,.net,linq,C#,.net,Linq,我有一种叫做附件 如果它是真的,那么我想确保单元格值不是空的 否则它可以是空的。我有以下资料: var items = (from a in allRowsrows where accessories == true ? a["MASTERID"].ToString() != "": a["MASTERID"].ToString() == "" && a["ITEMNO"].ToString() != a["NEWITEMNO"].T
附件
如果它是真的,那么我想确保单元格值不是空的
否则它可以是空的。我有以下资料:
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();
仍然是错误的过滤 这就是你想要的吗
var items =
(
from a in allRowsrows
where accessories ? a["MASTERID"].ToString() != "" : true
where a["ITEMNO"].ToString() != a["NEWITEMNO"].ToString() || a["LABEL"].ToString() != a["NEWVISITEMNO"].ToString()
select new ItemsToUpdate
{
isAccessory = accessories,
Item = a
}
).ToList();
这就是你想要的吗
var items =
(
from a in allRowsrows
where accessories ? a["MASTERID"].ToString() != "" : true
where a["ITEMNO"].ToString() != a["NEWITEMNO"].ToString() || a["LABEL"].ToString() != a["NEWVISITEMNO"].ToString()
select new ItemsToUpdate
{
isAccessory = accessories,
Item = a
}
).ToList();
您是否尝试在where子句中使用括号
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子句中使用括号
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()
这意味着:
如果附件为真,则检查MASTERID是否为空。就是这样。但是,这就是错误所在,如果附件是假的,请检查以下整个情况:
其评估如下:
(a["MASTERID"].ToString() == "" &&
a["ITEMNO"].ToString() != a["NEWITEMNO"].ToString()
)
OR
a["LABEL"].ToString() != a["NEWVISITEMNO"].ToString()
换句话说,如果MASTERID为空并且ITEMNO与NEWITEMNO不同,它将永远不会检查标签。
您在问题中编辑的代码没有任何区别,它仍然意味着与上面相同的内容
现在你的问题是,为什么神秘性的答案会给出正确的结果。以下是他如何做到的:
where accessories ? a["MASTERID"].ToString() != "" : true
where a["ITEMNO"].ToString() != a["NEWITEMNO"].ToString() || a["LABEL"].ToString() != a["NEWVISITEMNO"].ToString()
这意味着:
如果附件为真,则检查MASTERID是否为空。否则使用值true
。此外,请检查以确保ITEMNO与NEWITEMNO或LABEL与NewVisiteMNo不相同
所以本质上它是这样做的:
(accessories ? a["MASTERID"].ToString() != "" : true)
&&
(
a["ITEMNO"].ToString() != a["NEWITEMNO"].ToString() ||
a["LABEL"].ToString() != a["NEWVISITEMNO"].ToString()
)
我不知道您的全部要求,但我担心即使是Enigmativity的答案也可能产生错误的结果(或者可能不会)。这完全取决于你什么时候会遇到具体的情况。也许,我的解释可以为您提供指导。以下是您没有得到正确结果的原因。这种情况:
where accessories == true ? a["MASTERID"].ToString() != "": a["MASTERID"].ToString() == "" &&
a["ITEMNO"].ToString() != a["NEWITEMNO"].ToString() ||
a["LABEL"].ToString() != a["NEWVISITEMNO"].ToString()
这意味着:
如果附件为真,则检查MASTERID是否为空。就是这样。但是,这就是错误所在,如果附件是假的,请检查以下整个情况:
其评估如下:
(a["MASTERID"].ToString() == "" &&
a["ITEMNO"].ToString() != a["NEWITEMNO"].ToString()
)
OR
a["LABEL"].ToString() != a["NEWVISITEMNO"].ToString()
换句话说,如果MASTERID为空并且ITEMNO与NEWITEMNO不同,它将永远不会检查标签。
您在问题中编辑的代码没有任何区别,它仍然意味着与上面相同的内容
现在你的问题是,为什么神秘性的答案会给出正确的结果。以下是他如何做到的:
where accessories ? a["MASTERID"].ToString() != "" : true
where a["ITEMNO"].ToString() != a["NEWITEMNO"].ToString() || a["LABEL"].ToString() != a["NEWVISITEMNO"].ToString()
这意味着:
如果附件为真,则检查MASTERID是否为空。否则使用值true
。此外,请检查以确保ITEMNO与NEWITEMNO或LABEL与NewVisiteMNo不相同
所以本质上它是这样做的:
(accessories ? a["MASTERID"].ToString() != "" : true)
&&
(
a["ITEMNO"].ToString() != a["NEWITEMNO"].ToString() ||
a["LABEL"].ToString() != a["NEWVISITEMNO"].ToString()
)
我不知道您的全部要求,但我担心即使是Enigmativity的答案也可能产生错误的结果(或者可能不会)。这完全取决于你什么时候会遇到具体的情况。也许,我的解释可以指导您。在括号中加上一些括号,以便准确定义逻辑运算的优先级您正在使用的
|
和&
都没有括号-您期望的查询是什么?其中a==1&(b==2 | c==3)
与其中(a==1&&b==2)不同| | c==3
您可能需要在条件的周围加上括号,因为它的优先级低于&
和|
如果是真的,那么我想确保单元格值不是空的,因为它可以是空的,如果这是您的要求,那么为什么还有所有其他条件?请告诉我们帮助您解决问题的全部要求。为了准确定义逻辑运算的优先级,请在括号中加上一些括号。您正在使用的|
和&
都不带括号-您期望的查询是什么?其中a==1&(b==2 | c==3)
与其中(a==1&&b==2)不同| | c==3
您可能需要在条件的周围加上括号,因为它的优先级低于&
和|
如果是真的,那么我想确保单元格值不是空的,因为它可以是空的,如果这是您的要求,那么为什么还有所有其他条件?请告诉我们帮助您的全部要求。这给了我正确的筛选。我很难理解为什么需要两个where子句?如果您使用修改后的代码检查我的编辑,我会认为解决方案应该与您的类似,但我编辑的代码仍然为我提供了错误的筛选。@ThunD3eR-两个where
子句确保了条件的优先顺序。在A和B|C模糊的地方做——你可以在A和B|C模糊的地方做或者在A和B|C模糊的地方做。我喜欢后者,因为它更干净。这给了我正确的过滤。我很难理解为什么需要两个where子句?如果您使用修改后的代码检查我的编辑,我会认为解决方案应该与您的类似,但我编辑的代码仍然为我提供了错误的筛选。@ThunD3eR-两个where
子句确保了条件的优先顺序。在A和B|C模糊的地方做——你可以在A和B|C模糊的地方做或者在A和B|C模糊的地方做。我喜欢后者,因为它更干净。没什么区别。与我的原始代码和修改代码一样,仍然得到一个值@Enigmativity工作得很好,只是试图理解两个where子句的需要。请在附件==true?a[“MASTERID”].ToString()!=“”:true
。没有区别。与我的原始代码和修改代码一样,仍然得到一个值@Enigmativity工作得很好,只是试图理解两个where子句的需要。请在附件==true?a[“MASTERID”].ToString()!=“”:正确
。出色且精确。谢谢,这很好地解释了事情。现在有点明显了,但我想当你明白自己的错误时总是如此。@thund3