Учитывая приведенные ниже два примера LINQ, в какой точке определяется источник данных 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);
Я понимаю, что базовый код, используемый для запроса этих двух различных источников данных живет в пределах IEnumerable объекта, полученного с помощью методов LINQ.
Мой вопрос в том, в какой именно момент определяется, будет ли генерироваться код для использования библиотеки Linq To Objects или библиотеки Linq To XML?
Я бы предположил, что базовый код (код, который фактически выполняет работу с запросом данных), используемый для запроса этих источников данных, существует в своих собственных библиотеках и вызван в зависимости от источника данных. Я просмотрел https://referencesource.microsoft.com/, чтобы посмотреть на код метода Where/extension, предполагающего, что вызов нужного провайдера может быть там, но он, как представляется, является общим.
Как определяется магия, которая входит в IEnumerable?
'IEnumerable' не определяется до тех пор, пока не изменится на« определенный »тип, например, когда вы вызываете' .ToList() 'или' .ToArray() 'на нем. Но сам 'IEnumerable' никогда не определяется. – Franck
Спасибо - я должен был назвать его экземпляром IEnumerable. – Brummy
Единственный раз, когда этот вопрос имеет значение, когда вы работаете с IQueryable. В противном случае это не все довольно много linq для объектов. (Но фактическое внедрение, которое используется, выбирается во время компиляции, основываясь на том, какие классы вы предоставляете в качестве входных данных и какие методы расширения разрешены.) –