Смешивание необработанного SQL с IQueryable для динамического фильтра - PullRequest
0 голосов
/ 07 октября 2019

В платформе сущностей 6 возможно смешивать динамический SQL, сгенерированный динамически, с IQueryable следующим образом:

IQueryable<Tree> tree_query = context.Trees.Where(t=>t.Height> 2);
IEnumerable<int> tree_additional_filter = context.Database.SqlQuery<int>("SELECT Id FROM TREE_VIEW WHERE Width < 1");

IQueryable<Tree> final_query = from tree in tree_query 
                               join filtering_tree in tree_additional_filter on filtering_tree.id equals tree.id
                               select tree;

Это дает результат как есть, но «tree_additional_filter» выполняется в базе данных для того, чтобыпостроить final_query. Как сделать так, чтобы инфраструктура сущностей создавала только один запрос из этого?

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

Я также пытался создать сущность TREE_VIEW только с столбцом Idкоторый я знаю, чтобы всегда быть там. Использовал System.Linq.Dynamic для динамического конструирования предложения where на объекте TREE_VIEW, который имеет только свойство Id, но, очевидно, выражения не могут быть построены, если свойства не существуют в Type.

Ответы [ 2 ]

0 голосов
/ 08 октября 2019

Мне удалось это сделать.

  1. Использование Генерация динамического типа для создания типа (NewDynamicType) из полей, которые я выбрал, выбрав top 1 из моего TREE_VIEW,Прикрепил NewDynamicType к контексту БД через DbModelBuilder.RegisterEntityType в OnModelCreating.
  2. С System.Linq.Dynamic , тогда я мог бы построить IQueryable, выбрав из context.Set(NewDynamicType) любые поляпользователь хочет фильтровать по.
  3. Присоединиться к final_query, как в моем вопросе.

Теперь моя HTML-форма получает поля из представления базы данных, и в каждом распределении я могу иметь разныефильтры определены без необходимости писать какие-либо c #.

0 голосов
/ 07 октября 2019

В платформе сущностей 6 возможно смешивать динамический SQL, сгенерированный динамически, с IQueryable следующим образом:

Нет. Обратите внимание, что Database.SqlQuery возвращает IEnumerable<T>, а не IQueryable<T>. Поэтому любые дополнительные выражения запроса будут выполняться к результатам запроса с использованием LINQ to Objects.

Композиция запросов с необработанными запросами SQL была введена в EF Core.

...