为什么有非通用的IQueryable?

时间:2015-01-24 15:37:28

标签: c# .net linq linq-expressions

  1. 为什么有通用的IQueryable?你可以提供一个用途吗?

  2. 出于同样的原因,非通用ElementType接口的IQueryable成员是否多余?

  3. 引入仿制药后,引入了两个IQueryable接口。因此,同源版本和非泛型版本看起来不像IEnumerable及其通用版本那样是一种进化过程。

    当然,微软必须有充分的理由保留这两个接口吗?

1 个答案:

答案 0 :(得分:0)

此界面的主要目的是允许访问ElementTypeExpressionProvider,而无需了解通用类型。

在编写Generic Types时,这是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());
}