Смешивание необработанного 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 ответа
Мне это удалось.
- Использование генерации динамического типа для создания типа (
NewDynamicType
) из полей, которые я получил, выбрав 1 верхний из моихTREE_VIEW
. ПрикрепилNewDynamicType
в контекст БД черезDbModelBuilder.RegisterEntityType
вOnModelCreating
. - С https://github.com/kahanu/System.Linq.Dynamic я мог построить
IQueryable
выбор изcontext.Set(NewDynamicType)
любые поля, по которым пользователь хочет фильтровать. - Присоединяйтесь к
final_query
как в моем вопросе.
Теперь моя HTML-форма получает поля из представления базы данных, и в каждом выпуске я могу определять разные фильтры без необходимости писать какой-либо C#.
В Entity Framework 6 можно смешивать необработанный SQL, динамически генерируемый с IQueryable, следующим образом:
Нет. Обратите внимание, что Database.SqlQuery возвращаетIEnumerable<T>
, а не IQueryable<T>
. Поэтому любые дополнительные выражения запроса будут выполняться для результатов запроса с использованием LINQ to Objects.
Составление запросов с необработанными SQL- запросами было введено в EF Core.