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