按多个值过滤收集列

时间:2019-05-09 13:08:17

标签: c# entity-framework

我有一个集合,我想用包含多个值的列之一对其进行过滤。过滤器值是动态生成的,我不知道会得到多少。

我尝试了以下操作但未成功:

var input = @"was.Name.Contains(""Test"") ||  was.Name.Contains(""Test2"")";                             

var test = collection.Where(was => input)).ToList();

2 个答案:

答案 0 :(得分:3)

假设您以CSV字符串的形式接收过滤器值:

class Node {
  private static HashMap<N, Property> properties;

  public Property getProperty() {
    return properties.get(this);
  }
}

这应转换为以下SQL:

var csvFilters = "Test1, Test2";
// split by ',', remove empty entries, 
// trim each filter and store the result in a list
var filters = csvFilters.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
                        .Select(x => x.Trim())
                        .ToList();

// return items in collection whose Name property
// is equal to any of the items in filters
var result = collection.Where(x => filters.Contains(x.Name)).ToList();

答案 1 :(得分:2)

我猜您想使用LINQ。问题是,如何保留“过滤器”值?我会以理解您问题的方式回答。

如果应该以{{1​​}}为条件,那么我建议使用input。这意味着Func<Object,bool>将是您要查找的条件,如果找到,它将返回input

这是一个简单的例子:

true

然后,如果您调用给定示例参数的函数:

IEnumerable <T> FindElements (Func<Object, bool> condition, IEnumerable<T> inputList)
{   
    List<T> outputList = new List<T>();
    foreach(var element in inputList)
    {
        if(condition != null && condition(element))
          outputList.Add(element);
    }
    return outputList;
}

您应该在string input[] = {"Test1","Test2"}; foreach(string s in input) { targetList = FindElements(element=>((cast)element).Name.Contains(s), collection); } 中获得名称为Test1或Test2的所有元素。当然,Cast是元素实例化的类的名称。