c# - 如何使用linq在where子句中设置条件过滤器?

标签 c# .net linq

我有一个名为 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/

相关文章:

c# - 仅基于 WPF、WCF 和 ADO.net 的 .Net 项目同时将 DB 作为 Sybase 是否可能?

c# - 从 ASP.MVC 中基于 AOP 的身份验证到 NodeJS

c# - .Net 中的私有(private)构造函数与静态构造函数

.net - 使用自定义 View 状态提供程序会出现哪些陷阱?

c# - Linq,其中实体属性包含另一个列表

c# - 如何从 WCF 回调类更新 GUI 标签?

c# - 在 ASP.NET 中包含 log4Net 外部配置文件的最佳实践

.net - 从您的方法返回异常是不好的做法

c# - 帮助 C# LINQ 投影

c# - 使用 linq group by 从具有 DateTime 属性的对象列表获取具有间隔 StartDate、EndDate 的列表