简体   繁体   English

如何使用 generics 和 Linq 扩展方法过滤列表?

[英]How can I filter a list using generics and Linq extension methods?

I'm trying to write a generic Filter extension method for a system, such that I can call filter on any List and pass in a Dictionary of field names and their values to filter on.我正在尝试为系统编写一个通用的过滤器扩展方法,这样我就可以在任何列表上调用过滤器并传入字段名称及其值的字典以进行过滤。

I currently have a method for each type in my system, but I'm trying to consolidate to one method.我目前对我的系统中的每种类型都有一种方法,但我正在尝试合并为一种方法。

Here is what I have so far...simplified so it's only text searching:到目前为止,这是我所拥有的......简化了,所以它只是文本搜索:

public static List<T> Filter<T>(this List<T> model, string json)
    {
        JavaScriptSerializer ser = new JavaScriptSerializer();
        Dictionary<string, object> searchFields = (Dictionary<string, object>)ser.DeserializeObject(json);

        foreach (var key in searchFields.Keys)
        {               
            // How do I perform the search?               
        }

        return model;
    }

My current filter is a switch statement over each key and checking each field as follows:我当前的过滤器是对每个键的 switch 语句并检查每个字段,如下所示:

switch(key) 
{
    case "Description":
        list = list.Where(x => x.Description.ToLower().Contains(searchFields[key].ToString().ToLower())).ToList();
                    break;
}

How do I access the property on the generic object to filter it?如何访问通用 object 上的属性来过滤它? I assume I need reflection somehow, but I don't know the syntax.我假设我需要以某种方式进行反思,但我不知道语法。

I'm looking for something like:我正在寻找类似的东西:

list = list.where(listobject.getField(key).contains(value))

Is this possible?这可能吗? Thanks in advance for your help!在此先感谢您的帮助!

try something like that inside your foreach loop在你的foreach循环中尝试类似的东西

 model.Where(m => typeof(T).GetProperty(key).GetValue(m, null)==searchFields[key]);
foreach (var key in searchFields.Keys)
{               
    model.Where(m => typeof(T).GetProperty(key).GetValue(m, null).Equals(SearchFields[key], StringComparison.OrdianlIgnoreCase);         
}

return model.ToList();

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM