Основная цель этого интерфейса - разрешить доступ к 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());
}
Связанный: https://stackoverflow.com/questions/56375/are-non-generic-collections-in-net-obsolete – Chris
http://stackoverflow.com/questions/18535017/iqueryable-vs- iqueryablet – Tuco
Посмотрите на это как сокращение для 'IQueryable