introduzione
Proprio come questa domanda relativa a Nibernate, mi stavo chiedendo se esiste qualcosa del genere per Entity Framework 6. Ho fatto delle ricerche ma non ho trovato nulla di utile.
Oltre a interrogare i risultati impaginati usando .Skip(x)
e .Take(y)
, vogliamo ottenere il conteggio di tutti gli elementi corrispondenti alle nostre clausole where prima di applicare la paginazione.
Ora inseriamo la query LINQ, con le clausole where applicate, in una variabile, in modo che possiamo usarla due volte, una volta per ottenere il conteggio, una volta per ottenere i risultati impaginati.
Ma per motivi di prestazioni vogliamo fare entrambe le cose in una query, come faresti con COUNT (*) OVER () in una query SQL RAW.
Domanda
Entity Framework supporta COUNT(*) OVER()
qualche modo? In caso contrario, puoi dare un puntatore su dove iniziare a cercare l'implementazione di questo.
proposte
Per prima cosa ho pensato di creare un metodo di estensione IQueryable<T>
: CountOver(out long totalCount)
, ma questo potrebbe non funzionare poiché stiamo ancora creando la query.
Poi ho pensato di introdurre un attributo [CountOver]
che potremmo usare nei nostri modelli di entità:
public class Person
{
public string Fullname { get; set; }
[CountOver]
public long TotalCount { get; set; }
}
Se potessimo modificare la fonte, quest'ultima non sarebbe così difficile da implementare, ma al momento non ho idea se questo sia persino possibile ...
No. LINQ non ha un operatore di query che concettualmente si traduce in COUNT () OVER (). Ma puoi riutilizzare una query sia per Count () che per le sue righe, e selezionarne i risultati.
ad esempio, qualcosa di simile
var q = db. . . ;
var q2 = from r in q
select new { r, count = q.Count() };