2009-02-11 6 views
1

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

я пытаюсь узнать, как использовать предикаты вместе с LINQ к SQL, чтобы изменить мои запросы

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

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

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

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

+0

Re ваш комментарий - в самом деле, большинство операций LINQ имеют «отложенное выполнение» (ничего не происходит, пока вы не перебирать его) позволяет «создавать» а запрос постепенно - добавление фильтров/сортировок/прогнозов и т. д. в течение нескольких этапов. Только такие вещи, как Count(), Max() и т. Д., Выполняются немедленно. –

ответ

0

(кстати - предикаты лямбда-основе, используемые с LINQ к SQL являются C# 3.0/.NET 3.5, а не C# 2,0)

Ну, чем конкретно вы пытаетесь это сделать?

Предикаты - это просто фильтры (либо как делегат, либо выражение); они не напрямую позволяют изменять TSQL и т. д., если вы не объедините их с функциями, которые может обрабатывать поставщик LINQ-to-SQL (these), или 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.

+0

Я пытаюсь сделать запрос таблицы клиентов и отфильтровать ее на основе изменяющихся критериев. например найти всех клиентов, которые имеют почтовый индекс = 90210 найти всех клиентов, которые мужчины найти всех клиентов, которые мужчины и> имеют ZipCode = 90210 сейчас я использую, если/другое, что чувствует себя очень неправильно – jorsh1

+0

жаль, Бесполезный Не понимаю, что форматирование здесь не работает. Я обновил свой вопрос, чтобы его было легче читать. – jorsh1

+0

благодарите отметку, запрос не будет выполнен, пока он не сработает правильно? так что мне не нужно беспокоиться о том, что запрос выполняется дважды в примере «комбинирование отдельно»? если это так, это ТОЧНО, что я искал! – jorsh1

1

предикат является просто метод со следующей подписью:

bool Predicate<T>(T item) 

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

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

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

item => item.Nickname == "ThinkBeforeCoding"; 
Смежные вопросы