C# 将IQueryable作为参数传递

C# 将IQueryable作为参数传递,c#,.net,iqueryable,C#,.net,Iqueryable,我有一个类,我想将数据列表传递给它。我想让这个班 返回整个数据集中的供应商列表 根据作为参数的条件过滤数据,并将过滤结果作为第二个可枚举列表返回 我已经添加了IQueryable条件作为我想要实现的伪代码。这可能吗 internal class Problem { public IEnumerable<Vendor> Vendors { get; set; } public IEnumerable<Class1> ReturnedData { get; s

我有一个类,我想将数据列表传递给它。我想让这个班

  • 返回整个数据集中的供应商列表
  • 根据作为参数的条件过滤数据,并将过滤结果作为第二个可枚举列表返回 我已经添加了
    IQueryable
    条件作为我想要实现的伪代码。这可能吗

    internal class Problem
    {
        public IEnumerable<Vendor> Vendors { get; set; }
        public IEnumerable<Class1> ReturnedData { get; set; }
    
        public Problem(List<Class1> data, IQueryable condition)
        {
            Vendors = data.SelectMany(d => d.Vendors).Select(v => v.VendorName).Distinct().Select(v => new Vendor {VendorName =  v}).ToList();
    
            ReturnedData = data.AsQueryable().Where(condition);
        }
    }
    
    internal class Class1
    {
        public IEnumerable<Vendor> Vendors { get; set; }
        // lots of other stuff
    }
    
    internal class Vendor
    {
        public object VendorName { get; set; }
    }
    
    内部类问题
    {
    公共IEnumerable供应商{get;set;}
    公共IEnumerable返回数据{get;set;}
    公共问题(列表数据、IQueryable条件)
    {
    Vendors=data.SelectMany(d=>d.VendorName).Select(v=>v.VendorName).Distinct().Select(v=>newvendorname{VendorName=v}).ToList();
    ReturnedData=data.AsQueryable()。其中(条件);
    }
    }
    内部类1
    {
    公共IEnumerable供应商{get;set;}
    //还有很多其他的东西
    }
    内部类供应商
    {
    公共对象VendorName{get;set;}
    }
    
    当作为扩展方法调用时,它采用的参数不是
    IQueryable
    实例,而是谓词表达式:

    public Problem(List<Class1> data, Expression<Func<Class1, bool>> condition)
    {
        Vendors = data.SelectMany(d => d.Vendors).Select(v => v.VendorName).Distinct()
                      .Select(v => new Vendor {VendorName =  v}).ToList();
    
        ReturnedData = data.AsQueryable().Where(condition);
    }
    

    我会做稍微不同的事情

    首先安装nuget package System.Linq.Dynamic

    Install-Package System.Linq.Dynamic
    
    此后,, `IQueryable的Where函数将支持字符串作为参数。所以你可以这样做:

    protected static IQueryable<T> ApplyGridFilter<T>(IQueryable<T> query)
    {
                var qText = "id == 1";
    
                query = query.Where(qText);
                return query;
    }
    
    受保护的静态IQueryable ApplyGridFilter(IQueryable查询)
    {
    var qText=“id==1”;
    query=query.Where(qText);
    返回查询;
    }
    

    这样做的好处是,您可以在客户端轻松地构建where条件,而无需创建
    Func>

    我更喜欢只使用委托作为输入参数,并在调用类中实现过滤器逻辑

        class Problem{
            public Problem(data, Func<data, IEnumerable<Class1>> delegate){
                  ReturnedData = delegate(data);
            }
         }
    
    var problem = new Problem(data, ds => ds.where(d => d.name =="xyz").tolist());
    
    类问题{
    公共问题(数据、职能代表){
    ReturnedData=代表(数据);
    }
    }
    var problem=新问题(数据,ds=>ds.where(d=>d.name==“xyz”).tolist());
    
    它确实将IQueryable作为参数。第二个参数是谓词。@sturcotte06,虽然在技术上是正确的,但这是因为它是IQueryable上的扩展方法。它很少被直接调用,而且几乎总是作为扩展方法调用,这正是OP调用它的方式。因此,正确重载所期望的参数将是谓词,而传递IQueryable的唯一时间将是直接调用它时。
        class Problem{
            public Problem(data, Func<data, IEnumerable<Class1>> delegate){
                  ReturnedData = delegate(data);
            }
         }
    
    var problem = new Problem(data, ds => ds.where(d => d.name =="xyz").tolist());