Wyobrazić sobie klasę, powiedzmy, do stronicowania, które mogą być używane z IList<T>
lub IQueryable<T>
.Użyj IQueryable.Count <T> z IEnumerable <T> parametr
Ta klasa miałaby właściwość int TotalItems
, co mogłoby (nie jest to zaskakujące) uzyskać/ustawić liczbę parametru możliwego do wyśledzenia lub przeliczenia.
Jeśli używam IEnumerable<T>
jako parametr,
//simplified
public Pagination(IEnumerable<T> query)
{
TotalItems = query.Count();
}
metoda Count()
będzie (jeśli się nie mylę, to punkt) Enumerable.Count()
. Więc nawet jeśli zapytanie to IQueryable<T>
(które dziedziczy po IEnumerable<T>
), zostanie ono wyliczone (co oczywiście nie jest pożądane z "zapytaniem db").
Więc jest jakiś sposób na wykorzystanie Queryable.Count()
metodę gdy mój IEnumerable<T>
jest w rzeczywistości IQueryable<T>
, czy muszę zmienić mój projekt, mający na przykład w tym przypadku 2 konstruktor
//simplified
public Pagination(IEnumerable<T> query)
{
TotalItems = query.Count();
}
public Pagination(IQueryable<T> query)
{
TotalItems = query.Count();
}
EDIT Rozumiem, że IQueryable<T>
dziedziczenie z IEnumerable<T>
nie ma nic wspólnego z tym, że IEnumerable<T>
imają metody rozszerzenia o tej samej nazwie i że dobrze jest mieć takie same nazwy dla metody rozszerzenia, które "wyglądają tak, jak robią to samo", ale myślę, że to nadal czasami mylące ...
Generic pytanie z ciekawości
Czy są inne przykłady, w ramach, z tym samym „architektura”: dziedziczenie + nazwy zwyczajowe dla metod rozszerzenie?
dlaczego po prostu nie akceptować "int" i pozwolić im zliczyć sekwencję/zapytanie, skąd to się wzięło? – Servy
@AakashM cóż, to pytanie pojawia się po prawdziwej próbie i spojrzeniu na wyniki MiniProfilera: być może zrobiłem złą interpretację, w takim przypadku rozbiję głowę na ścianie;) –
@Servy jak wskazano, to jest przypadkiem uproszczonym, mógłbym chcieć użyć parametru 'query' w innym celu w mojej klasie i wywołać inne" udostępnione "zapytania lub możliwe do rozszerzenia metody rozszerzenia, które miałyby ten sam problem (jeśli problem istnieje). –