Creating a DbSet <T> from an expression to create a dynamic query service
I am trying to create a dynamic query service using the Entity Framework.
My approach is to somehow create an easy client to create DTO queries by creating IQueryable<T>
or Expression
, and then send this query \ expression over the network to the runtime service, which will translate IQueryable<T>
\ Expression
to SQL, run it and return it IEnumerable<S>
.
My thought was to use Enumerable.Empty<T>.AsQueryable()
to create queries, but then, when I need to execute the queries, I need the ability to translate them into SQL - and how the Entity Framework can help me.
Entity Framework does this magic using classes that implement IQueryable<T>
like DbSet<T>
and DbQuery<T>
.
I can create a client that will create IQueryable<T>'s
using the Entity Framework dummy DbContext
, so I can basically create queries and be able to create SQL from them on the client.
I tried to combine between the frameworks and use the Entity Framework to create SQL from mine IQueryable<T>'s
, and then run it using Dapper, but it gets complicated when the attached navigation properties are involved, and I still want to be able to modify queries using custom ones Expression<Func<T,T>>'s
on my service.
Thus, making queries on the client and sending SQL to the service is not really the right solution for me.
DbSet<T>
Expression
? - "" a 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>
Expression
DbSet<T>
?
(DbSet<T>.Parse(expression)
:-))