Sto leggendo questo tutorial . Voglio utilizzare la query async
con EF Core.
Funziona bene quando lo uso in questo modo:
var tasks = await _taskRepository
.GetAll()
//.WhereIf(!string.IsNullOrEmpty(input?.Title), x => x.Title.Contains(input.Title))
//.WhereIf(input?.State != null, x => x.State == input.State.Value)
//.OrderByDescending(x => x.CreationTime)
.ToListAsync();
ma voglio usare whereif e ordinare come
var tasks = await _taskRepository
.GetAll()
.WhereIf(!string.IsNullOrEmpty(input?.Title), x => x.Title.Contains(input.Title))
.WhereIf(input?.State != null, x => x.State == input.State.Value)
.OrderByDescending(x => x.CreationTime)
.ToListAsync();
Errore:
'IOrderedEnumerable' non contiene una definizione per 'ToListAsync' e non è possibile trovare alcun metodo di estensione 'ToListAsync' che accetta un primo argomento di tipo 'IOrderedEnumerable' (ti manca una direttiva using o un riferimento assembly?)
Stai usando l'estensione WhereIf sbagliata, è facile non vederla perché devi aggiungere altro utilizzando Visual Studio non offrirà.
Stai utilizzando l'estensione che restituisce IEnumerable
Abp.Collections.Extensions.EnumerableExtensions.WhereIf<T>()
È necessario utilizzare l'estensione che restituisce IQueryable
Abp.Linq.Extensions.QueryableExtensions.WhereIf<T>()
È una soluzione semplice, basta aggiungere all'inizio del file usando Abp.Linq.Extensions;
IOrderedEnumerable<Task>
significa che stai lavorando con un IEnumerable<Task>
.
Entity Framework Core funziona con IQueryable<T>
(che rappresenta una query di database), non IEnumerable<T>
(che rappresenta una raccolta in memoria). Non appena IQueryable<T>
viene convertito in IEnumerable<T>
, la query viene eseguita sul server di database e il risultato recuperato.
Quindi: se si chiama un metodo che restituisce IEnumerable<T>
, questo metodo non è stato creato per essere utilizzato in LINQ alle entità.