LINQ в среде выполнения .NET 2.0

Может ли приложение с поддержкой LINQ работать на компьютере, на котором установлена ​​только среда выполнения .NET 2.0?

Теоретически LINQ - это не что иное, как синтаксический сахар, и результирующий код IL должен выглядеть так же, как в .NET 2.0.

Как я могу написать LINQ без использования библиотек .NET 3.5? Будет ли он работать на .NET 2.0?

Ответов (8)

Решение

Есть некоторые «уловки», которые включают использование System.Core.dll из 3.5 Framework, чтобы заставить его работать с .net 2.0, но лично я бы не хотел использовать такой шаткий фундамент.

См. Здесь: поддержка LINQ в .NET 2.0

  1. Создайте новое консольное приложение
  2. Оставьте только System и System.Core в качестве ссылочных сборок
  3. Установите для параметра Copy Local значение true для System.Core, поскольку его нет в .NET 2.0.
  4. Используйте запрос LINQ в методе Main. Например, тот, что ниже.
  5. Строить
  6. Скопируйте весь вывод bin на машину, на которой установлен только .NET 2.0
  7. Запустить

(Требуется .net 2.0 SP1, и я понятия не имею, нарушает ли сборка System.Core.dll лицензионное соглашение)

Странно, что никто не упомянул LINQBridge . Этот замечательный проект представляет собой бэкпорт LINQ (IEnumerable, но без IQueryable) и его зависимостей (Func, Action и т. Д.) Для .NET 2.0. А также:

Если ваш проект ссылается на LINQBridge во время компиляции, он будет привязан к операторам запроса LINQBridge; если он ссылается на System.Core во время компиляции, он будет привязан к операторам запросов Framework 3.5.

Вы можете использовать источники LINQ из mono (.NET для Linux), чтобы LINQ работал в .NET 2.0.

IEnumerable<T> : yes 
IQueryable<T>  : yes
LINQ to XML : has been working in the trunk, but due to further additions, the trunk doesn't compile anymore

Кто-то сделал это здесь:
LINQ для .NET 2.0

Короткий ответ:

  • LINQ to Objects: да ( IEnumerable<T>)
  • LINQ to SQL / Entities: нет ( IQueryable<T>)
  • LINQ to XML / DataSets: еще нет?

См. Этот вопрос о функциях .Net 3.5, доступных автоматически или с небольшими усилиями при настройке .Net 2.0 из VS2008.

По сути, все, что является только «синтаксическим сахаром», и новые компиляторы (C# 3.0, VB 9.0) испускают как 2.0-совместимый IL, будет работать. Сюда входят многие функции, используемые LINQ, такие как анонимные классы, лямбда-выражения в качестве анонимных делегатов, автоматические свойства, инициализаторы объектов и инициализаторы коллекций.

Некоторые функции LINQ используют классы, интерфейсы, делегаты и методы расширения, которые живут в новых сборках 3.5 (например, System.Core.dll). Распространение этих сборок является нарушением лицензии, но они могут быть реализованы повторно. Для использования методов расширения нужно только объявить пустой System.Runtime.CompilerServices.ExtensionAttribute . LINQ to Objects основывается на IEnumerable<T> расширениях и нескольких объявлениях делегатов (семейств Action<T> и Func<T> ) и реализован в LINQBridge (как упоминал Мауш ). LINQ to XML и LINQ to DataSets полагаются на LINQ to Objects, который, я думаю, также может быть реализован для .Net 2.0, но я еще не видел этого.

LINQ to SQL and LINQ to Entities require many new classes ( DataContext / ObjectContext, lots of attributes, EntitySet<T>, EntityRef<T>, Link<T>, IQueryable<T>, etc) and expression trees, which, even if somehow reimplemented, will probably require at least .Net 2.0 SP1 to work.

Насколько мне известно, библиотека LINQ доступна только начиная с версии 3.0. Если вы хотите использовать что-то подобное во фреймворке 2.0, вам придется переписать его самостоятельно :) или найти аналогичную стороннюю библиотеку. Я только нашел немного информации здесь , но это не убедило меня ни.

Теоретически да, при условии, что вы распространяете специфические сборки LINQ и любые зависимости. Однако это нарушает лицензирование Microsoft. Скотт Хансельман написал в блоге сообщение о развертывании ASP.NET MVC на ASP.NET 2.0, которое похоже на то, что вы хотите сделать.

Нет, потому что, хотя вы думали, что LINQ - это просто синтаксический сахар, на самом деле он сильно использовал деревья выражений - функция, отсутствующая в .NET 2.0.

При этом .NET 3.5 строится только поверх .NET 2.0, и поэтому IL не выглядит «другим» или «особенным».

Я не вижу причин, по которым вам не следует просто устанавливать .NET 3.5 Framework. Все .NET 2.0 будет нормально работать, обещаю :)

Я не уверен насчет C#.

Однако я знаю, что вы можете писать код VB LINNQ без библиотек 3.5, если вы используете компилятор VS 2008 для таргетинга на платформу 2.0.

Однако вам придется реализовать некоторые методы LINQ самостоятельно.

LINQ использует синтаксическое преобразование для преобразования запросов в исполняемый код. По сути, это будет такой код:

dim q = from x in xs where x > 2 select x*4;

и преобразовать его в такой код:

dim q = xs.where(function(x) x > 2).select(function(x) x * 4);

Для функциональности LINQ, поставляемой с платформой 3.5, эти методы реализованы как методы расширения либо в IEnumerable, либо в IQueryable (есть также набор методов, которые также работают с наборами данных).

Методы расширения IEnumerable по умолчанию определены в System.Linq.Enumerable и выглядят следующим образом:

<Extension()>
public function Select(of T, R)(source as IEnumerable(of T), transform as Func(of T, R)) as IEnumerable(of R)

   'do the transformation...

end function

Методы расширения IQueryable принимают в качестве аргументов деревья выражений, а не лямбды. Они выглядят так:

 <Extension()>
 public function Select(of T, R)(source as IQueryable<T>, transform as Expression(of Func(of T, R))
     'build a composite IQueryable that contains the expression tree for the transformation
 end function

Версии дерева выражений позволяют получить представление в виде дерева выражений, предоставленных в предложениях, которые затем можно использовать для генерации кода SQL (или чего угодно еще).

Вероятно, вы могли бы создать свою собственную версию LINQ to objects примерно за день. Все довольно просто.

Если вы хотите использовать DLINQ, все будет немного сложнее.