Фильтрация подзапросов с использованием Dynamic LINQ

Я работаю над большим приложением, которое использует динамическую библиотеку LINQ для фильтрации .

Все классы на моем уровне доступа к данным являются производными от общего предка DALAncestor, который, среди прочего, определяет метод GetData: общедоступный абстрактный список GetData (фильтр-фильтр)

Реализация этого метода для клиента будет выглядеть так (упрощенно):

public override List 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();
}

«Применить» - это метод, который принимает набор условий и применяет их все с помощью Dynamic LINQ Libary.

Метод GetData вызывается следующим образом:

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

  var list = myCustomerDAL.GetData(filter);
  // do something
}

SQL Server получает статус выбора:

SELECT [t0].ID, [t0].Name, [t0].Country
  FROM Customer [t0]
 WHERE [t0].Country = @p0

(@ p0 - параметр, значение которого установлено на «Австрия»).

Все отлично работает, если я хочу фильтровать значения только на «верхнем» (главном) уровне.Однако, поскольку я создаю свой фильтр на основе ввода пользователя в форме фильтра, бывают случаи, когда пользователи хотят фильтровать по значению на уровне детализации (т. Е. Столбцы, по которым выполняется фильтрация, становятся известными только после того, как пользователь нажимает «Поиск»).

Я не могу найти решение для этого: «Получить всех клиентов из Австрии, которые купили Pepsi».

Я пробовал несколько вещей, но ни одна из них не работает. Основная идея:
1. Добавить поддержку CONTAINS в DynamicLibrary
2. Измените мой код на

public override List 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: ни один универсальный метод 'Contains' для типа 'System.Linq.Enumerable' не совместим с предоставленными аргументами и аргументами типа. Не следует указывать аргументы типа, если метод не является универсальным.

Кто-нибудь знает, что я делаю не так? Или я просто иду в неправильном направлении и мне следует попробовать другой подход? Который? :)

EDITED: изменил мой пример

5
задан Marko Juvančič 18 November 2011 в 12:15
поделиться