Основная цель этого интерфейса — разрешить доступ к 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());
}
person
Chad Carisch
schedule
09.02.2015
IQueryable<object>
и не более - person SimpleVar   schedule 24.01.2015