Смешивание необработанного SQL с IQueryable для динамического фильтра

В Entity Framework 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 ответа

Решение

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

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

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

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

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

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

Другие вопросы по тегам