我正在尝试使用 Entity Framework 创建一个动态查询服务。
我的方法是创建一个轻量级的客户端,用于在 DTO 上创建查询,生成一个 IQueryable<T>
或一个 Expression
,然后将该查询\表达式通过网络发送到执行服务,该服务将把 IQueryable<T>
\ Expression
转换成 SQL,运行并返回一个 IEnumerable<S>
。
我想使用 Enumerable.Empty<T>.AsQueryable()
来创建查询,但是当我需要执行查询时,我需要能够将它们转换为 SQL - 这就是 Entity Framework 应该帮助我的地方。
Entity Framework 利用实现了 IQueryable<T>
接口的类(如 DbSet<T>
和 DbQuery<T>
)来完成其工作。
我可以创建一个客户端,使用一个 Entity Framework 的虚拟 DbContext
来创建 IQueryable<T>
,这样我就可以在客户端上创建查询,并有能力从中生成 SQL。
我尝试混合使用框架,使用 Entity Framework 从我的 IQueryable<T>
中生成 SQL,然后使用 Dapper 执行它,但是当涉及到嵌套导航属性时会变得复杂,并且我仍然希望能够在我的服务上使用自定义的 Expression<Func<T,T>>
来修改查询。
因此,在客户端创建查询并将 SQL 发送到服务端并不适合我。
有没有办法可以从一个 Expression
创建一个 DbSet<T>
?或者以某种方式“序列化”一个 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);`
我的服务需要以某种方式接收查询,将其翻译成 SQL 语句,执行并在数据库中运行。
现在我考虑使用 Entity Framework 进行翻译,但我的主要问题是如何将 IQueryable 或 Expression 序列化,并在服务上创建一个 DbSet? (DbSet.Parse(expression) 就好了 :-) )
DbContext
静态类型化(即添加已知实体),或者必须完全通用(即适用于任何数据库/表)吗? - Camilo Terevinto