使用 T 作为字典过滤 IEnumerable<T> 数据集<string, object>

Filtering IEnumerable<T> dataset with T as Dictionary<string, object>

有一个数据集 IEnumerable<T> GridData 绑定到数据网格。在一种情况下,数据以 T 加载为 Dictionary<string, object>。当用户在网格上应用 filter/sort 时,我可以得到如下结果。

filters : [{Property: 'abc', Value: 'aaa'}]
sort: [{Property: 'abc'}]

Dictionary<string, object>Key代表PropertyValue代表Value.

我无法在 IEnumerable<T> GridData 上进行筛选和排序。谁能告诉我方向?

我会选择这样的辅助函数

    private static object GetPropValue(object src, string propName)
    {
        return src.GetType().GetProperty(propName)?.GetValue(src, null);
    }

然后像这样过滤 GridData 假设过滤器是一个数组,您需要检查它上面的所有过滤器。

    private static void test<T>(IEnumerable<T> GridData, Dictionary<string, object> filters)
    {

        IEnumerable<T> result = GridData;
        foreach (KeyValuePair<string, object> filter in filters.ToList())
        {
            result = result.Where(x =>
                       (x as Dictionary<string, object>).Values.Any(d =>
                         filter.Value.Equals((T)GetPropValue(d, filter.Key))));
        }
    }

如果您的过滤器不是字典,只有元组列表

    private static void test2<T>(IEnumerable<T> GridData, List<Tuple<string, object>> filters)
    {

        IEnumerable<T> result = GridData;
        foreach (Tuple<string, object> filter in filters.ToList())
        {
            result = result.Where(x =>
                       (x as Dictionary<string, object>).Values.Any(d =>
                         filter.Item2.Equals((T)GetPropValue(d, filter.Item1))));
        }
    }

并使用相同的方法进行排序