Вопрос

Есть ли в Интернете хорошие учебные пособия по изучению «предикатов» языка С# 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";
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top