Метод расширения для получения динамически построенного поискового выражения? - PullRequest
1 голос
/ 16 марта 2011

Я думаю, что мы в основном ищем метод расширения, который мог бы взять IQueryable и вернуть IQueryable на основе всего оператора запроса, а не только оператора where.

Пример того, что мы хотели бы для метода поиска:

IRepository<Person> repository = new Repository<Person>();
var results = repository.GetQuery().Include("Names").Search([dynamic linq here]);

В настоящее время мы имеем где мы строим динамический оператор linq внутри метода where

IRepository<Person> repository = new Repository<Person>();
var results = repository.GetQuery().Include("Names").Where([dynamic linq here]);

Проблема с этим подходом состоит в том, что мы хотим включить SelectMany и Select в фактический динамический запрос linq. Вы не можете использовать SelectMany внутри метода Where, если вы на самом деле не входите во вспомогательные свойства вложенных свойств. Мы хотели бы сделать что-то вроде следующего динамического оператора linq.

SelectMany("Names").Where("LastName.Contains(@0)", "Smith").Select("Person")

Ответы [ 2 ]

1 голос
/ 18 марта 2011

Мы решили эту проблему без использования метода расширения.Мы смогли использовать аналогичный запрос, который работает внутри метода Where.

Таким образом, вместо ...

SelectMany("Names").Where("LastName.Contains(@0)", "Smith").Select("Person") 

Мы смогли получить тот же результат с помощью следующего запроса, который можетбыть внутри метода Where.

Where.("Names.Select(LastName).Contains(@0)", "Smith)

Тогда, когда просто нужно было добавить агрегат Contains в библиотеку Dynamic Linq.

http://blog.walteralmeida.com/2010/05/advanced-linq-dynamic-linq-library-add-support-for-contains-extension-.html

SelectMany прислал намв погоне за диким гусем!

0 голосов
/ 26 ноября 2013

Оформить заказ на этот пакет nuget: NinjaNye.SearchExensions

Позволяет сделать что-то вроде следующего:

var repository = new Repository<Person>();
var results = repository.GetQuery().Search(p => p.LastName, "Smith");

Подключено кsql это даст что-то смехотворное к следующему:

SELECT [Extent1].[Id] AS [Id], 
       ... [other properties],
       [Extent1].[LastName] AS [LastName] 
FROM   [dbo].[Person] AS [Extent1]
WHERE  ([Extent1].[LastName] LIKE N'%Smith%')

Запрос построен с использованием деревьев выражений, поэтому результат будет чистым.Проверьте исходный код здесь: https://github.com/ninjanye/SearchExtensions/

...