繁体   English   中英

创建一个DbSet <T> 从表达式中创建动态查询服务

[英]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 FrameworkIQueryable<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>ExpressionDbSet<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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM