从表达式创建DbSet <t>以创建动态查询服务

时间:2018-01-09 13:48:55

标签: c# entity-framework repository

我尝试使用 Entity Framework 创建动态查询服务。

我的方法是以某种方式创建一个轻量级客户端,用于通过DTO创建查询,生成IQueryable<T>Expression,然后通过网络将该查询\表达式发送到执行将IQueryable<T> \ Expression转换为SQL的服务,运行它并返回IEnumerable<S>

我的想法是使用Enumerable.Empty<T>.AsQueryable()来创建查询,但是当我需要执行查询时,我需要能够将它们转换为SQL - 以及实体框架<的方式/ em>可以帮助我。

实体框架使用实现IQueryable<T>的类DbSet<T>DbQuery<T>来实现它的神奇功能。
我可以使用 Entity Framework dummy IQueryable<T>'s创建一个创建DbContext的客户端,这样我基本上可以创建查询并且能够在客户端上从中生成SQL

我尝试在框架之间混合并使用 Entity Framework 从我的IQueryable<T>'s生成SQL,然后使用 Dapper 执行它,但是当嵌套时它变得复杂涉及导航属性,我仍然希望能够使用我的服务上的自定义Expression<Func<T,T>>'s修改查询。
因此,在客户端创建查询并将SQL发送到服务对我来说并不是一个合适的解决方案。

有什么方法可以从DbSet<T>创建Expression吗?或者以某种方式&#34;序列化&#34; a DbSet<T>
是否有任何其他推荐的框架可以帮助我实现此功能?

修改 - &gt;这是我尝试实现的一些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>.Parse(expression)会很好:-))

1 个答案:

答案 0 :(得分:1)

Givent知道T(根据评论),您可以使用Expression使用收到的CreateQuery创建查询:

var context = new YourContext();
var data = context.Set<T>()
    .AsQueryable()
    .Provider.CreateQuery(yourReceivedExpressionOfTEntity)
    .ToList();