在.Net 4.0中可以使用实现IQueryable <T>的实例化类型?

one*_*mer 40 linq types interface iqueryable c#-4.0

在.Net 4.0上的C#的上下文中,是否有任何内置对象可以实现IQueryable<T>

Kei*_*thS 59

IQueryable对象由可查询提供程序生成(例如,LINQ to SQL,LINQ to Entities/Entity Framework等).实际上,您无法new在基本.NET Framework中实例化任何实现IQueryable的内容.

IQueryable是一个用于创建可查询提供程序的接口,它允许通过构建可解析的表达式树来利用LINQ库对外部数据存储.从本质上讲,Queryables需要一个上下文 - 有关您正在查询的内容的信息.使用new创建任何IQueryable类型,无论是否可能,都不会让你走得太远.

话虽这么说,任何IEnumerable都可以IQueryable通过使用AsQueryable()扩展方法转换为.这在幕后创建了一个表面上相似但功能上非常不同的构造,就像对普通IEnumerable对象使用LINQ方法一样.这可能是您无需设置实际IQueryable提供程序即可访问的最丰富的可查询源.这种转换对于基于LINQ的算法进行单元测试非常有用,因为您不需要实际的数据存储,只需要一个可以模仿它的内存数据列表.

  • 这是非常不同的.而不是由IEnumerable Linq方法生成的Iterator对象链,IQueryable方法将节点添加到Expression树.该树本身不像Iterator那样可执行代码.但是,它是可序列化的,可解析的等等,因此您可以确定查询的结构并将其转换为另一种语言(如SQL)的查询. (5认同)
  • 谢谢.您描述的场景(单元测试)几乎就是我正在做的事情.您是否知道有关您提到的构造差异的任何好文档?我很想知道在使用`AsQueryable()`扩展方法时对象有多么不同. (3认同)
  • 是的,你有基本的概念.继续阅读; 两者之间存在着重要的差异,但基本的要点是,虽然两者都允许对你构建的任何构造进行"懒惰"评估,但IEnumerable Linq用于处理内存中的对象集合,而IQueryable Linq则用于交谈到"内存不足"的数据源. (2认同)