C#中的Linq语句,带有使用Any()的多个过滤器

时间:2018-08-19 16:43:59

标签: c# linq

我有一个带有LINQ语句的代码段,需要对下面的问题语句进行修改。

var orders = ordersets.Where(OrderSetIsOk).ToList(); 
var orderOther = ordersets.Except(orders).ToList();

private bool OrderSetIsOk(OrderSet value)
{
    bool result = false;
    var privateorders = user.privateorders;

    result = privateorders.Any(a => a.strHead == value.Code ||
                                    (a.10Code == value.10Code) ||
                                    (value.Complaint != null &&
                                     a.strHead == value.Complaint.9Code));

    return result;
}

我有这样的示例订单集:

A : value.10code = "B6"; value.Code = "" 
B : value.10code = "G6"; value.code = ""
c : value.10code = "G6"; value.code = "189"

问题:当a.strHead为“”且value.code =“ 189”和value.10code =“ G6”时。 B和C应该返回true,但是A应该返回false。我需要更改Any语句,以便A返回false,但是B和C返回true。有任何想法吗?

2 个答案:

答案 0 :(得分:0)

最好在代码到达Any之前对数据进行规范化。我建议您删除大多数空值,并仅保留特定的“ G6”需求,例如

 privateorders.Where(ord => !string.IsNullOrEmtpy(ord.Code) || ord.10code = "G6")
              .Any( …_)

因此已将它们从考虑中删除。根据需要计算出Where的逻辑。

答案 1 :(得分:-1)

尝试以下操作:

results = privateorders.Where(a => a.strHead == value.Code ||
                                    (a.10Code == value.10Code) ||
                                    (value.Complaint != null &&
                                     a.strHead == value.Complaint.9Code)).ToList();