代码之家  ›  专栏  ›  技术社区  ›  ThunD3eR

如何使用linq在where子句中设置条件筛选器?

  •  1
  • ThunD3eR  · 技术社区  · 7 年前

    我有一种叫博莱恩的病症 accessories

    如果这是真的,那么我要确保单元格值不是空的 否则它可以是空的。我有以下几点:

    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();
    

    还是过滤错误。

    3 回复  |  直到 7 年前
        1
  •  5
  •   CodingYoshi    7 年前

    这就是为什么你没有得到正确的结果。这种情况:

    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() ||
    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。

    现在你的问题是为什么神秘性的答案会给你正确的结果。他就是这样得到的:

    where accessories ? a["MASTERID"].ToString() != "" : true
    where a["ITEMNO"].ToString() != a["NEWITEMNO"].ToString() || a["LABEL"].ToString() != a["NEWVISITEMNO"].ToString()
    

    如果附件为真,则检查MASTERID是否为空。否则使用值 true

    所以本质上它是这样做的:

    (accessories ? a["MASTERID"].ToString() != "" : true)
    &&
    (
        a["ITEMNO"].ToString() != a["NEWITEMNO"].ToString() || 
        a["LABEL"].ToString() != a["NEWVISITEMNO"].ToString()
    )
    

        2
  •  2
  •   Enigmativity    7 年前

    这就是你要找的吗?

    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();
    
        3
  •  -2
  •   Bugfish    7 年前

    你在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();