我尝试使用 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)
会很好:-))
答案 0 :(得分:1)
Givent知道T
(根据评论),您可以使用Expression
使用收到的CreateQuery
创建查询:
var context = new YourContext();
var data = context.Set<T>()
.AsQueryable()
.Provider.CreateQuery(yourReceivedExpressionOfTEntity)
.ToList();