将原始 SQL 与 IQueryable 混合用于动态过滤器

Mixing raw SQL with IQueryable for dynamic filter

在 entity framework 6 中是否可以像这样混合使用 IQueryable 动态生成的原始 SQL:

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。如何让 entity framework 仅从中构建一个查询?

我需要它来创建与静态过滤字段一起工作的动态过滤字段。

我还尝试创建 TREE_VIEW 仅包含 Id 列的实体,我知道它始终存在。 使用 System.Linq.Dynamic 在仅具有 ID 属性 的 TREE_VIEW 实体上动态构建 "where" 子句,但如果类型中不存在属性,则显然无法构建表达式。

In entity framework 6 is it possible to mix raw SQL generated dynamically with IQueryable like this:

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

Query Composition with raw SQL EF Core 中引入了查询。

我做到了。

  1. 使用 Dynamic type generation 从字段中创建类型 (NewDynamicType),我从 TREE_VIEW 中选择了前 1 个字段。通过 OnModelCreating 中的 DbModelBuilder.RegisterEntityTypeNewDynamicType 附加到数据库上下文。
  2. 使用 System.Linq.Dynamic 然后我可以构建 IQueryablecontext.Set(NewDynamicType) 中选择用户想要过滤的任何字段。
  3. 像我的问题一样加入final_query

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