ресурс для изучения предикатов
-
22-08-2019 - |
Вопрос
Есть ли в Интернете хорошие учебные пособия по изучению «предикатов» языка С# 2.0?
я пытаюсь научиться использовать предикаты вместе с linq to sql для изменения моих запросов
я пытаюсь запросить таблицу клиентов и отфильтровать ее на основе изменяющихся критериев.например
- найти всех клиентов, у которых почтовый индекс = 90210
- найти всех клиентов мужского пола
- найти всех клиентов мужского пола И> с почтовым индексом = 90210
прямо сейчас я делаю это, используя операторы if/else, что кажется довольно неправильным
Кроме того, возможно, мне придется добавить другие фильтры, поэтому мне нужно гибкое решение этой проблемы, которое можно легко расширить, ничего не нарушая (я думаю, принцип открытости и закрытости)
Решение
(кстати, предикаты на основе лямбда-выражений, используемые с LINQ-to-SQL, — это C# 3.0/.NET 3.5, а не C# 2.0)
Ну и что конкретно ты пытаешься сделать?
Предикаты — это просто фильтры (как делегаты, так и выражения);они не делают напрямую позволяют вам изменять TSQL и т. д., если вы не объединяете их с функциями, которые может обрабатывать поставщик LINQ-to-SQL (эти) или UDF, сопоставленные с вашим контекстом данных как составные функции (FunctionAttribute
).
В самом простом:
мужчины И > имеют почтовый индекс = 90210
var qry1 = from cust in ctx.Customers
where cust.Gender == 'M' && cust.Zip = '90210'
select cust;
var qry2 = from cust in ctx.Customers
where cust.Zip = '90210'
select cust;
Или для нетривиального примера (форма динамического поиска/комбинирование отдельно)
IQueryable<Foo> query = ctx.Customers;
// note "gender" here is "char?" for this example
if(gender != null) query = query.Where(x=>x.Gender == (char)gender);
if(zip != null) query = query.Where(x=>x.Zip == zip);
и т. д.
Вы также можете создавать предикаты на основе выражений вручную, но это требует больше работы и требует знания API выражений.
Другие советы
Предикат — это просто метод со следующей сигнатурой:
bool Predicate<T>(T item)
Он представляет собой условие, которое может быть проверено или нет объектами типа T.
Он используется в ссылке для фильтрации перечислимых значений в .Where
пункт.
Вы также можете использовать лямбды, которые возвращают логическое значение:
item => item.Nickname == "ThinkBeforeCoding";