Представьте себе класс, допустим, для разбивки на страницы, который можно использовать с IList<T>
или IQueryable<T>
.
Этот класс будет иметь свойство int TotalItems
, которое (не удивительно) получит/задает счетчик запрашиваемого или перечислимого параметра.
Если я использую IEnumerable<T>
как параметр,
//simplified
public Pagination(IEnumerable<T> query)
{
TotalItems = query.Count();
}
метод Count()
будет (, если я не ошибаюсь, что точка) Enumerable.Count()
. Таким образом, даже если запрос является IQueryable<T>
(который наследуется от IEnumerable<T>
), он будет перечисляться (что явно не желательно с "запросом db" ).
Итак, есть способ использовать метод Queryable.Count()
, когда мой IEnumerable<T>
на самом деле является IQueryable<T>
, или мне нужно изменить свой дизайн, имея, например, в этом случае 2 ctor
//simplified
public Pagination(IEnumerable<T> query)
{
TotalItems = query.Count();
}
public Pagination(IQueryable<T> query)
{
TotalItems = query.Count();
}
ИЗМЕНИТЬ
Я понимаю, что IQueryable<T>
, наследующий от IEnumerable<T>
, не имеет ничего общего с тем, что IEnumerable<T>
и IQueryable<T>
имеют методы расширения с одинаковым именем, и что это хорошо, чтобы иметь одинаковые имена для метода расширения, которые выглядят они делают то же самое ", но я думаю, что это все еще иногда путается...
Общий вопрос для любопытства
Являются ли они другими примерами в рамках с той же "архитектурой": наследование + общие имена для методов расширения?