代码之家  ›  专栏  ›  技术社区  ›  r3plica

泛型类和筛选

  •  -1
  • r3plica  · 技术社区  · 7 年前

    我有一个通用类:

    public class DataProvider<T> where T : class
    {
        private readonly IService<T> _service;
        public DataProvider(IService<T> service) => _service = service;
    
        public IQueryable<T> List(params string[] includes) => _service.List(includes);
    }
    

    现在我想根据任何查询字符串参数筛选结果。 例如,我想返回包含单词“special”但用于特定字段的项。查询字符串可能如下所示:

    ?title=特殊

    我想用linq来过滤结果,但我不确定这是否可能。 我换了我的 列表 方法如下:

    public IQueryable<T> List(HttpRequestMessage request, params string[] includes)
    {
        var queryString = request.GetQueryNameValuePairs();
        var models = _service.List(includes);
        // TODO: Do a contains linq query
    }
    

    有可能做这样的查找吗?或者我必须将泛型类型更改为如下类:

    public class DataProvider<T> where T : Availability
    {
        private readonly IService<T> _service;
        public DataProvider(IService<T> service) => _service = service;
    
        public IQueryable<T> List(HttpRequestMessage request, params string[] includes)
        {
            var queryString = request.GetQueryNameValuePairs();
            var models = _service.List(includes);
            // TODO: Do a contains linq query
        }
    }
    

    即使如此,我如何动态地查找属性? 我有这样的经历:

    foreach (var item in queryString)
        models = models.Where(m => m.GetType().GetProperty(item.Key).GetValue(m).ToString().Contains(item.Value));
    

    有人知道怎么做吗?

    1 回复  |  直到 7 年前
        1
  •  0
  •   r3plica    7 年前

    使用dynamic linq,我能够做到:

    public class DataProvider<T> where T : class
    {
        private readonly IService<T> _service;
        public DataProvider(IService<T> service) => _service = service;
    
        public IQueryable<T> List(HttpRequestMessage request)
        {
            var queryString = request.GetQueryNameValuePairs();
            var models = _service.List();
            foreach (var item in queryString)
            {
                var query = $"{ item.Key }.ToString().Contains(\"{ item.Value }\")";
                models = models.Where(query);
            }
            return models;
        }
    }
    

    解决了我的问题