【发布时间】:2017-05-18 18:36:53
【问题描述】:
鉴于以下两个 LINQ 示例,LINQ 数据源是在什么时候确定的?
int[] numbers = new int[7] { 0, 1, 2, 3, 4, 5, 6 };
IEnumerable<int> linqToOjects = numbers.Where(x => true);
XElement root = XElement.Load("PurchaseOrder.xml");
IEnumerable<XElement> linqToXML = root.Elements("Address").Where(x => true);
我的理解是,用于查询这两个不同数据源的底层代码位于 LINQ 方法生成的 IEnumerable 对象中。
我的问题是,究竟是在什么时候确定将生成代码以使用 Linq To Objects 库还是 Linq To XML 库?
我假设用于查询这些数据源的底层代码(实际执行查询数据工作的代码)存在于它们自己的库中,并且依赖于数据源而被调用。我查看了 https://referencesource.microsoft.com/ 以查看 Where 子句/扩展方法的代码,认为对所需提供程序的调用可能在其中,但它似乎是通用的。
进入 IEnumerable 的魔法是如何确定的?
【问题讨论】:
-
IEnumerable直到它更改为“已确定”类型(例如当您在其上调用.ToList()或.ToArray()时)才确定。但IEnumerable本身从未确定。 -
谢谢 - 我应该把它写成 IEnumerable 实例。
-
唯一重要的是当您使用 IQueryable 时。否则,并不是所有的对象都是 linq。 (但实际使用的实现是在编译时根据您提供的输入类和解析的扩展方法来选择的。)
标签: c# linq ienumerable extension-methods