2

在实体框架 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。我怎样才能使实体框架只构造一个查询?

我需要它来创建与静态过滤器字段一起使用的动态过滤器字段。

我还尝试创建只有 Id 列的 TREE_VIEW 实体,我知道它总是在那里。使用 System.Linq.Dynamic 在只有 Id 属性的 TREE_VIEW 实体上动态构造“where”子句,但如果类型中不存在属性,显然无法构建表达式。

4

2 回答 2

1

我设法做到了。

  1. 使用动态类型生成NewDynamicType我从我的TREE_VIEW. 通过in将附加NewDynamicType到 db 上下文。DbModelBuilder.RegisterEntityTypeOnModelCreating
  2. 使用System.Linq.Dynamic然后我可以从用户想要过滤的任何字段中进行IQueryable选择。context.Set(NewDynamicType)
  3. 在我的问题中加入final_querylike。

现在我的 HTML 表单从数据库视图中获取字段,并且在每个分布中,我可以定义不同的过滤器,而无需编写任何 c#。

于 2019-10-08T13:38:04.333 回答
0

在实体框架 6 中,是否可以将动态生成的原始 SQL 与 IQueryable 混合,如下所示:

不。请注意,Database.SqlQuery返回的是IEnumerable<T>,而不是IQueryable<T>。因此,将使用 LINQ to Objects 针对查询结果执行任何其他查询表达式。

EF Core 中引入了具有原始 SQL 查询的查询组合。

于 2019-10-07T15:33:47.093 回答