Entity Framework Core Plus Query Deferred
Description
There are two types of IQueryable extension methods:
Deferred Methods: The query expression is modified but the query is not resolved (Select, Where, etc.). Immediate Methods: The query expression is modified and the query is resolved (Count, First, etc.). However, some third party features like Query Cache and Query Future cannot be used directly with Immediate Method since the query is already resolved.
EF+ Query Deferred provides more flexibility to other features.
// Oops! The query is already executed, we cannot cache it. var count = ctx.Customers.Count(); // Oops! All customers are cached instead of the customer count. var count = ctx.Customers.FromCache().Count();
Here comes in play the deferred query which acts exactly like deferred methods, by modifying the query expression without resolving it.
// using Z.EntityFramework.Plus; // Don't forget to include this. var ctx = new EntitiesContext(); // The count is deferred and cached. var count = ctx.Customers.DeferredCount().FromCache();
All LINQ IQueryable extension methods and overloads are supported:
- DeferredAggregate
- DeferredAll
- DeferredAny
- DeferredAverage
- DeferredContains
- DeferredCount
- DeferredElementAt
- DeferredElementAtOrDefault
- DeferredFirst
- DeferredFirstOrDefault
- DeferredLast
- DeferredLastOrDefault
- DeferredLongCount
- DeferredMax
- DeferredMin
- DeferredSequenceEqual
- DeferredSingle
- DeferredSingleOrDefault
- DeferredSum
Options
Using Query Cache and Query Future
Defer the execution of a query which is normally executed to allow some features like Query Cache and Query Future.
// using Z.EntityFramework.Plus; // Don't forget to include this. var ctx = new EntitiesContext(); // Query Cache ctx.Customers.DeferredCount().FromCache(); // Query Future ctx.Customers.DeferredCount().FutureValue();
Execute
Execute the deferred query and return the result.
// using Z.EntityFramework.Plus; // Don't forget to include this. var ctx = new EntitiesContext(); var countDeferred = ctx.Customers.DeferredCount(); var count = countDeferred.Execute();
Real Life Scenarios
EF Query Deferred brings advantages to other third party features:
- Allows to use Immediate Method with EF+ Query Cache.
- Allows to use Immediate Method with EF+ Query Future.
- Allows to use Immediate Method with YOUR own features.
Behind the code
When a deferred method is used, the query expression is created exactly like a non-deferred method but instead of invoking the execute method from the query provider, a new instance of a class QueryDeferred
The QueryDeferred instance has methods to either execute the expression from the query provider or let a third party library use the object query.
Conclusion
As we saw, EF+ Query Deferred brings considerable advantages to other libraries by letting them use immediate methods without removing any of their features.
Need help getting started? info@zzzprojects.com
We welcome all comments, ideas and suggestions to improve our library.