动态Linq包含筛选列表

时间:2013-12-13 18:51:20

标签: c# linq oop generics dynamic

我有这个方法

public static IEnumerable<T> Filter<T>(IEnumerable<T> source, string searchStr)
{
    var propsToCheck = typeof(T).GetProperties().Where(a => a.PropertyType == typeof(string));

    var filter = propsToCheck.Aggregate(string.Empty, (s, p) => (s == string.Empty ? string.Empty : string.Format("{0} OR ", s)) + string.Format("{0} == @0", p.Name).ToLower());

    var filtered = source.AsQueryable().Where(filter, searchStr);
    return filtered;
}

其中包含List和搜索字符串,并在列表中查找任何匹配项。但是这仅适用于100%匹配,如何使这种情况不敏感并使用包含而不是100%匹配?

1 个答案:

答案 0 :(得分:3)

构建动态LINQ查询看起来不像这里的最佳选择。使用委托进行过滤会做得更好:

public static IEnumerable<T> Filter<T>(IEnumerable<T> source, string searchStr)
{
  var searchStrLower = searchStr.ToLower();
  var propsToCheck = typeof(T).GetProperties().Where(a => a.PropertyType == typeof(string) && a.CanRead);

  return source.Where(obj => {
    foreach (PropertyInfo prop in propsToCheck)
    {
      string value = (string)prop.GetValue(obj);
      if (value != null && value.ToLower().Contains(searchStrLower)) return true;
    }
    return false;
  });
}