Ami*_*ich 5 c# entity-framework repository
我正在尝试使用Entity Framework创建动态查询服务。
我的方法是以某种方式创建一个轻客户端,用于通过 DTO 创建查询,生成一个IQueryable<T>或一个Expression,然后将该查询\表达式通过网络发送到执行服务,该执行服务将IQueryable<T>\转换Expression为 SQL,运行它并返回一个IEnumerable<S>.
我的想法是使用它Enumerable.Empty<T>.AsQueryable()来创建查询,但是当我需要执行查询时,我需要能够将它们转换为 SQL - 这就是实体框架应该帮助我的方式。
实体框架使用实现IQueryable<T>类似DbSet<T>和 的类来发挥它的魔力DbQuery<T>。我可以创建一个使用Entity Framework dummy
创建的客户端,因此我基本上可以创建查询并能够在客户端上生成 SQL。IQueryable<T>'sDbContext
我尝试在框架之间混合并使用实体框架从我的生成 SQL IQueryable<T>'s,然后使用Dapper执行它,但是当涉及嵌套导航属性时它会变得复杂,并且我仍然希望能够使用Expression<Func<T,T>>'s我的服务上的自定义修改查询。
因此,在客户端创建查询并将 SQL 发送到服务对于我来说并不是真正合适的解决方案。
有什么方法可以DbSet<T>从 an创建 aExpression吗?或者以某种方式“序列化” a DbSet<T>?
有没有其他推荐的框架可以帮助我实现此功能?
编辑- >这是我想要实现的一些伪代码:
客户:
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);`
Run Code Online (Sandbox Code Playgroud)
我的服务需要以某种方式接收查询,将其转换为 SQL,执行它并针对数据库运行它。
现在我考虑使用实体框架进行翻译,现在我的主要问题是如何序列化 anIQueryable<T>或 an并在服务上从中Expression创建 a ?DbSet<T>(DbSet<T>.Parse(expression)会好的 :-) )
鉴于您知道T(根据评论),您可以Expression使用收到的信息创建查询CreateQuery:
var context = new YourContext();
var data = context.Set<T>()
.AsQueryable()
.Provider.CreateQuery(yourReceivedExpressionOfTEntity)
.ToList();
Run Code Online (Sandbox Code Playgroud)