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

时间:2018-10-11 12:45:46

标签: c# .net linq

我有一个叫ResonseRaw myMockResponse = ..... mock the response RequestParams myParameter = ..... mock the params doReturn(myMockResponse)// .when(externalConnector)// .callExternal(isA(myParameter.getClass()), isA(MyResponse.class)); ResonseRaw myMockResponse2 = ..... mock the response RequestParams myParameter2 = ..... mock the params doReturn(myMockResponse2)// .when(externalConnector)// .callExternal(isA(myParameter2.getClass()), isA(MyResponse.class)); 的bolean条件

如果为true,则我要确保单元格值不为空 otherweise可以为空。我有以下内容:

doReturn(myMockResponse2)//
    .when(externalConnector)//
    .callExternal(eq(myParameter), isA(MyResponse.class));

问题: 好吧,简单地说,使用上述方法时,它无法正确过滤。

accessories

,然后应该给我一个包含0个项目的列表,但我仍在列表中找到项目。

我在做什么错?

编辑:

修改后的代码:

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

仍然过滤错误。

3 个答案:

答案 0 :(得分:5)

这就是为什么您未获得正确结果的原因。这种情况:

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

这意味着:

如果附件为true,则检查MASTERID是否为空。否则,请使用值true。另外,请检查以确保ITEMNO与NEWITEMNO不相同或LABEL与NEWVISITITEMNO不相同。

因此本质上是这样做的:

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

我不知道您的完整要求,但即使是Enigmativity的回答,也可能会产生错误的结果(也可能不会)。这完全取决于您何时会遇到具体情况。也许,我的解释可以指导您。

答案 1 :(得分:2)

这是你的追求吗?

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

答案 2 :(得分:-2)

您尝试在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();