使用Dynamic LINQ过滤子查询

Mar*_*čič 5 c# dynamic linq-to-sql

我正在使用动态LINQ库 进行过滤的大型应用程序.

我的数据访问层中的所有类都派生自一个共同的祖先DALAncestor,其中包括定义方法GetData:public abstract List GetData(Filter filter)

对于Customer,此方法的实现看起来像这样(简化):

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();
}
Run Code Online (Sandbox Code Playgroud)

"Apply"是一种获取条件集合并使用Dynamic LINQ Libary应用所有条件的方法.

方法GetData被调用如下:

private void DemoCallGetDataMethod() {
  var filter = new Filter();
  filter.AddCondition("Country", "Austria");

  var list = myCustomerDAL.GetData(filter);
  // do something
}
Run Code Online (Sandbox Code Playgroud)

SQL Server获取一个选择语句:

SELECT [t0].ID, [t0].Name, [t0].Country
  FROM Customer [t0]
 WHERE [t0].Country = @p0
Run Code Online (Sandbox Code Playgroud)

(@ p0是一个参数,其值设置为"奥地利").

如果我只想在"顶层"(主)级别上过滤值,那么一切都很有效.但是,由于我在过滤器表单上的用户输入上构建了我的过滤器,因此在某些情况下,用户希望按详细级别的值过滤(即,只有在用户单击"搜索"后才能知道要过滤的列).

我无法找到解决方案:"从奥地利购买百事可乐的所有客户".

我尝试了几件事,但似乎都没有.基本思想是:
1.将对CONTAINS的支持添加到DynamicLibrary
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
}
Run Code Online (Sandbox Code Playgroud)

抛出的照片是:

System.InvalidOperationException:类型'System.Linq.Enumerable'上没有泛型方法'Contains'与提供的类型参数和参数兼容.如果方法是非泛型的,则不应提供类型参数.

有谁知道我做错了什么?或者我只是朝着错误的方向前进,我应该尝试其他一些方法?哪一个?:)

编辑:改变了我的榜样

小智 2

\n

@user182630我希望能够在一般情况下按子选择中的值进行过滤,而不仅仅是针对特定情况。该文章中的方法仅在对过滤器进行硬编码时才有效,而这不是我能做的事情。\xe2\x80\x93 Marko Juvan\xc4\x8di\xc4\x8d 9 分钟前

\n
\n\n

阅读这篇文章http://csharpindepth.com/articles/chapter5/closures.aspx

\n