LINQ в .NET 2.0 Runtime

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

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

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

Ответ 1

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

Смотрите здесь: Поддержка LINQ на .NET 2.0

  • Создание нового консольного приложения
  • Храните только System и System.Core как ссылочные сборки
  • Установите Копировать Локальный в значение true для System.Core, потому что он не существует в .NET 2.0
  • Используйте запрос LINQ в методе Main. Например, ниже.
  • Построить
  • Скопировать весь вывод bin на машину, где установлен только .NET 2.0
  • Run

(Требуется .net 2.0 SP1, и я не знаю, связывает ли System.Core.dll с EULA)

Ответ 2

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

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

Ответ 3

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

Ответ 4

Вы можете использовать источники 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

Ответ 5

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

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

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

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

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

LINQ to SQL и LINQ to Entities требуют много новых классов (DataContext/ObjectContext, множество атрибутов, EntitySet<T>, EntityRef<T>, Link<T>, IQueryable<T> и т.д.) и деревья выражений, которые, даже если он каким-то образом переопределен, вероятно, потребуется, по крайней мере, работать с .NET 2.0 SP1.

Ответ 6

Я не уверен в С#.

Я знаю, однако, что вы можете написать код 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 для объектов примерно через день или около того. Все это довольно прямолинейно.

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

Ответ 7

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

Учитывая, что .NET 3.5 только создается поверх .NET 2.0, и причина, по которой IL не выглядит "другим" или "специальным".

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

Ответ 8

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

Ответ 9

Вы можете использовать linqbridge для .net 2.0