[英]Creating a DbSet<T> from an Expression in order to create a dynamic querying service
我正在尝试使用Entity Framework创建动态查询服务。
我的方法是以某种方式创建一个轻型客户端,以通过DTO创建查询,生成IQueryable<T>
或Expression
,然后通过网络将该查询\\表达式发送到执行服务,该服务会将IQueryable<T>
\\ Expression
转换为SQL,运行它并返回IEnumerable<S>
。
我的想法是使用Enumerable.Empty<T>.AsQueryable()
创建查询,但是当我需要执行查询时,我需要将它们转换为SQL的能力-这就是Entity Framework可以为我提供帮助的方式。
实体框架使用实现IQueryable<T>
类(如DbSet<T>
和DbQuery<T>
。
我可以创建一个客户端,该客户端将使用Entity Framework虚拟DbContext
创建IQueryable<T>'s
,因此我基本上可以创建查询,并具有在客户端上从中生成SQL的能力。
我尝试在框架之间混合使用Entity Framework从IQueryable<T>'s
生成SQL,然后使用Dapper执行它,但是当涉及嵌套导航属性时,它变得复杂,而我仍然希望能够使用自定义修改查询我的服务上有Expression<Func<T,T>>'s
。
因此,在客户端上创建查询并将SQL发送到该服务对我而言并不是真正合适的解决方案。
有什么方法可以从Expression
创建DbSet<T>
吗? 还是以某种方式“序列化” DbSet<T>
?
是否有其他推荐的框架可以帮助我实现此功能?
编辑 ->这是我想要实现的一些pseduo代码:
客户:
var query = QueryCreator
.Get<MyDto>()
.Include(d => d.MySonDto)
.Where(d => d.IsActive)
.OrderBy(d => d.MySonDto.Date)
.Take(10);
var result = service.Query(query); // or `service.Query(query.Expression);`
我的服务需要以某种方式接收查询,将其转换为SQL,执行并在数据库上运行。
现在我考虑使用Entity Framework进行翻译,现在我的主要问题是如何在服务上序列化IQueryable<T>
或Expression
并DbSet<T>
创建DbSet<T>
? ( DbSet<T>.Parse(expression)
会很不错:-))
鉴于您知道T
(根据注释),您可以使用CreateQuery
使用接收到的Expression
创建查询:
var context = new YourContext();
var data = context.Set<T>()
.AsQueryable()
.Provider.CreateQuery(yourReceivedExpressionOfTEntity)
.ToList();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.