ресурс для изучения предикатов - PullRequest
1 голос
/ 11 февраля 2009

Есть ли в Интернете какие-нибудь хорошие учебные пособия для изучения функции предикатов языка c # 2.0?

Я пытаюсь научиться использовать предикаты вместе с linq to sql для изменения моих запросов

я пытаюсь сделать запрос к таблице клиентов и отфильтровать ее по изменяющимся критериям. например

  • найти всех клиентов, у которых есть почтовый индекс = 90210
  • найти всех клиентов мужского пола
  • найти всех клиентов, которые являются мужчинами И> имеют почтовый индекс = 90210

сейчас я делаю это, используя операторы if / else, которые кажутся довольно неправильными

также возможно, что мне придется добавить другие фильтры, поэтому я хочу гибкое решение этой проблемы, которое легко расширить, не нарушая ничего (принцип открытого закрытого доступа, я думаю)

Ответы [ 2 ]

1 голос
/ 11 февраля 2009

Предикат - это просто метод со следующей сигнатурой:

bool Predicate<T>(T item)

Представляет условие, которое может проверяться или не проверяться объектами типа T.

Используется в ссылке для фильтрации перечислимых значений в предложении .Where.

Вы также можете использовать лямбда-выражения, которые возвращают логическое значение:

item => item.Nickname == "ThinkBeforeCoding";
0 голосов
/ 11 февраля 2009

(между прочим - основанные на лямбде предикаты, используемые с 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);

и т.д.

Вы также можете создавать предикаты на основе выражений вручную, но это более трудоемкий процесс, требующий знания Expression API .

...