2015-01-24 3 views
3
  1. Почему существует необоснованный IQueryable, когда есть общий? Не могли бы вы использовать его?Почему у вас нетривиальный IQueryable?

  2. Не является ли ElementType членом неосновного интерфейса по той же причине? были введены

Два IQueryable интерфейсы хорошо после того, как дженерики были введены. Таким образом, наличие как общей, так и не общей версии не выглядит как эволюционная прогрессия, как в случае с IEnumerable и его общей версией.

Наверняка, у Microsoft, должно быть, была веская причина держать оба интерфейса?

+0

Связанный: https://stackoverflow.com/questions/56375/are-non-generic-collections-in-net-obsolete – Chris

+0

http://stackoverflow.com/questions/18535017/iqueryable-vs- iqueryablet – Tuco

+2

Посмотрите на это как сокращение для 'IQueryable ' и не более – SimpleVar

ответ

0

Основная цель этого интерфейса - разрешить доступ к ElementType, Expression и Provider без необходимости знать общий тип.

Это довольно распространенная практика для Microsoft при написании общих типов. List<T> наследует от IList<T>, который наследует от IList.

Другими словами, вы хотите выставить любое свойство, которое не требует универсального типа не общим способом. В случае IQueryable<T> нет выставленных объектов. Однако общий тип T позволяет применять строго типизированные методы расширения, которые находятся в System.Linq.Queryable.

Обратите внимание на следующее:

void Main() 
{ 
    var lst = new List<string>(); 
    lst.Add("test1"); 
    lst.Add("test2"); 
    lst.Add("test3"); 

    IQueryable<string> q = lst.AsQueryable(); 

    PrintQueryInfo( q.Where(x=>x.Contains('1'))); 

} 

public void PrintQueryInfo(IQueryable q){ 
    Console.WriteLine(q.Expression.ToString()); 
} 

Выход:

System.Collections.Generic.List`1[System.String].Where(x => x.Contains(1)) 

Его также стоит отметить, что приведенный выше пример также может быть сделано с помощью универсального метода. Но это не всегда возможно или практично.

public void PrintQueryInfo<T>(IQueryable<T> q){ 
    Console.WriteLine(q.Expression.ToString()); 
} 
Смежные вопросы