C# 使用动态LINQ对子查询进行过滤

C# 使用动态LINQ对子查询进行过滤,c#,linq-to-sql,dynamic,C#,Linq To Sql,Dynamic,我正在开发一个用于过滤的大型应用程序 我的数据访问层中的所有类都派生自一个公共祖先,该祖先定义了方法GetData:public abstract List GetDataFilter 对于客户,此方法的实现如下所示: public override List<Entities.Customer> GetData(Filter filter) { var customers = from c in db.Customers select new

我正在开发一个用于过滤的大型应用程序

我的数据访问层中的所有类都派生自一个公共祖先,该祖先定义了方法GetData:public abstract List GetDataFilter

对于客户,此方法的实现如下所示:

public override List<Entities.Customer> GetData(Filter filter) {
  var customers = from c in db.Customers
                  select new Entites.Customer { 
                    ID = c.ID,
                    FullName = c.Name,
                    Country = c.Country
                  };

   return = filter.Apply(customers).ToList();
}
SQL Server获取一个select语句:

SELECT [t0].ID, [t0].Name, [t0].Country
  FROM Customer [t0]
 WHERE [t0].Country = @p0
@p0是一个参数,其值设置为奥地利

如果我只想在顶级主控级别上过滤值,那么一切都很好。但是,由于我是根据用户在筛选表单上的输入构建筛选的,因此在某些情况下,用户希望按详细程度的值进行筛选,即,只有在用户单击“搜索”后才能知道要筛选的列

我找不到解决办法:让所有购买百事可乐的奥地利客户都来

我试过好几种方法,似乎都不管用。基本思想是: 1.动态图书馆 2.将我的代码更改为

public override List<Entities.Customer> GetData(Filter filter) {
  var customers = from c in db.Customers
                  select new Entites.Customer { 
                    ID = c.ID,
                    FullName = c.Name,
                    Country = c.Country,
                    Items = c.Order.SelectMany(o => o.Item).Select(i => i.ItemId).ToList()
                  };

  return = filter.Apply(customers).ToList();
}

private void DemoCallGetDataMethod() {
  var filter = new Filter();
  filter.AddCondition("Country","=", "Austria");
  filter.AddCondition("Items","Contains", "11"); // 11 = Id for Pepsi

  var list = myCustomerDAL.GetData(filter);

  // do something
}
抛出的执行是:

System.InvalidOperationException:没有泛型方法“包含”类型“System.Linq.Enumerable”与提供的类型参数和参数兼容。如果方法是非泛型的,则不应提供类型参数

有人知道我做错了什么吗?还是我只是走错了方向,我应该尝试其他方法?哪个

编辑:更改了我的示例


@user182630我希望能够通过中的子选择的值进行筛选 一般情况下,不只是针对具体情况。该条的做法 只有当你硬编码你的过滤器,这不是一件事,我可以 做马尔科·朱文奇9分钟前


通读这篇文章

我在应用程序中使用PredicateBuilder进行动态查询

在你的情况下,我想会是这样:

 string MyCountry = "Austria";
 string MyProductId = 11

 var Predicate = PredicateBuilder.True<db.Customers>();
 Predicate = Predicate.And(p=>p.Country ==MyCountry && p.Order.SelectMany(o=>o.Item).Where(i=>i.id == 11).Count() >0);

 var list = Customers.Where(Predicate).Select(s=>s).ToList();

对不起,我不知道你在追求什么,你提到的这篇文章也为你面临的同样问题提供了答案,以避免出现例外。因为你想走这条路,我真的不明白你在追求什么:?filter.AddConditionItems,Contains,Pepsi;-这仅适用于字符串和字符串,而不适用于列表和字符串string@user182630通常,我希望能够通过子选择中的值进行过滤,而不仅仅是针对特定情况。那篇文章中的方法只有在你硬编码你的过滤器时才有效,这不是我能做的。@Tsabo不,它也适用于列表,我测试过它。但你是对的:也许我应该举一个ints而不是Strings的例子。这种方法在需要过滤的列上失败,而这些列只有在用户单击搜索要求后才知道。好吧,如果所有列都提前知道,那么这不是问题。它们不是。方法Apply filter不知道有关列的任何信息。但是有些接口成员必须知道有关列的信息,以便您可以选择筛选器。
 string MyCountry = "Austria";
 string MyProductId = 11

 var Predicate = PredicateBuilder.True<db.Customers>();
 Predicate = Predicate.And(p=>p.Country ==MyCountry && p.Order.SelectMany(o=>o.Item).Where(i=>i.id == 11).Count() >0);

 var list = Customers.Where(Predicate).Select(s=>s).ToList();