Я работаю над большим приложением, которое использует динамическую библиотеку 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: изменил мой пример