如何在 LINQ 中为泛型类型应用 OR 条件

How to apply OR condition in LINQ for generic types

我需要过滤可能包含不同字符串属性的通用对象 (TItem) 列表,例如“名称”、“描述”、“电子邮件”、“街道”等。具体取决于我可以传递的对象类型用于过滤目的的搜索键(字符串)列表。 在当前对象的以下示例中,我传递了两个搜索键,稍后我使用它们按名称获取 属性 值。但对于另一个对象,它可以是任何其他数量的具有不同名称的搜索键。 当我提前知道搜索键的数量时,我可以将其硬编码如下:

var searchString = "john";    
var propertyNames = new List<string>() { "Name", "Email" };
var originalList = new List<TItem>();
var filteredList = new List<TItem>();
    
// don't know how to apply OR (||) condition in below Where() method depending on how many search keys I might have
// I need to dynamically loop through searchKeys inside of Where()
    
filteredList = originalList.Where(e =>
        e.GetType().GetProperty(propertyNames[0]).GetValue(e).ToString().Contains(searchString) ||
        e.GetType().GetProperty(propertyNames[1]).GetValue(e).ToString().Contains(searchString)
    ).ToList();

但我不知道如何在 LINQ 中动态循环搜索键。是否可以使用任何循环技术动态添加“或”条件? 也可以提供其他方法。 接口方法在这里不起作用,因为 属性 名称完全不同。

更新: 现在,我使用嵌套的 foreach 循环解决了它。但对我来说,它看起来很脏。而且我认为当前的方法对性能有很大的影响,因为同一个列表将被迭代多次——对于每个 属性 name

filteredList = new List<TItem>();
foreach (var property in propertyNames)
{
    foreach (var item in originalList)
    {
        var match = item.GetType().GetProperty(property).GetValue(item).ToString().ToLower().Contains(searchString.ToLower());
        if (match && !filteredList.Contains(item))
        {
            filteredList.Add(item);
        }
    }
}

仍在寻找更简洁、更简洁的解决方案。最好使用 LINQ

我认为 linq Any 扩展符合这个要求。

filteredList = originalList
                .Where(e => propertyNames.Any(p =>
        e.GetType().GetProperty(p).GetValue(e).ToString().Contains(searchString) 
      )).ToList();