Метод расширения для получения динамически созданного поискового выражения?

Я думаю, что мы в основном ищем метод расширения, который мог бы принимать 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")

person Blane Bunderson    schedule 16.03.2011    source источник


Ответы (2)


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

Итак, вместо...

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

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

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

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

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

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

person Blane Bunderson    schedule 18.03.2011

Проверьте этот пакет 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/.

person NinjaNye    schedule 26.11.2013