LINQ to SQL - PredicateBuilder - PullRequest
       36

LINQ to SQL - PredicateBuilder

1 голос
/ 28 октября 2010

Быстрый вопрос о том, как получить еще больше от PredicateBuilder.Он работает следующим образом:

IQueryable<Product> SearchProducts (params string[] keywords)
{
  var predicate = PredicateBuilder.False<Product>();

  foreach (string keyword in keywords)
  {
    string temp = keyword;
    predicate = predicate.Or (p => p.Description.Contains (temp));
  }
  return dataContext.Products.Where (predicate);
}

Вопрос в том, что если я хотел бы выполнить поиск также по произвольному члену, то есть передать строку функции [] в качестве ключевых слов, но также поле для поисканапример, fieldToSearch и замените p => p.Description.Contains (temp));с чем-то, что позволяет искать по fieldToSearch?

Возможно ли это, это плохая идея?

Ответы [ 2 ]

1 голос
/ 28 октября 2010

Для того, что вы хотите сделать, Dynamic Linq может быть более подходящим.

При написании безопасных типов отлично подходит для большинства сценариев, есть случаи, когда вы хотите гибкость динамически строить запросы на муха. Например: вы можете захотеть предоставлять бизнес-аналитику в вашем приложении, которое позволяет Конечный пользователь бизнес-аналитик использовать выпадающие, чтобы построить и выразить свои собственные пользовательские запросы / представления поверх данные.

Традиционно эти типы динамических Сценарии запросов часто обрабатываются объединяя строки в строить динамические запросы SQL. Недавно несколько человек прислали мне почта спрашивает, как обрабатывать эти типы сценариев с использованием LINQ. Нижеприведенное пост описывает, как вы можете использовать Библиотека динамических запросов, предоставляемая Команда LINQ для динамического построения LINQ запросы.

http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

0 голосов
/ 28 октября 2010

Почему бы не иметь отдельный метод, который принимает Expression<Func<Product,bool>> в качестве параметра. Затем создайте предикат вне метода и передайте его в качестве параметра.

IQueryable<Product> SearchProducts (Expression<Func<Product,bool>> selector )
{
    return dataContext.Products.Where( selector );
}

используется как

var selector = PredicateBuilder.False<Product>()
                               .Or( p => p.Name == name )
                               .Or( p => p.Vendor == vendor );

products = repository.SearchProducts( selector );
...