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

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

56 голосов
/ 05 августа 2008

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

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

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

Ответы [ 9 ]

77 голосов
/ 27 декабря 2008

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

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

33 голосов
/ 05 августа 2008

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

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

  1. Создание нового консольного приложения
  2. Хранить только System и System.Core в качестве ссылочных сборок
  3. Установите для параметра Копировать локально значение true для System.Core, поскольку он не существует в .NET 2.0
  4. Использовать запрос LINQ в методе Main. Например, тот, что ниже.
  5. Сложение
  6. Скопировать весь вывод корзины на компьютер, на котором установлен только .NET 2.0
  7. Run

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

11 голосов
/ 05 августа 2008

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

7 голосов
/ 04 марта 2011

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

6 голосов
/ 19 мая 2009

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

  • LINQ к объектам: да (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 (как упоминалось 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 для работы.

5 голосов
/ 11 октября 2008

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

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

3 голосов
/ 05 августа 2008

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

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

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

2 голосов
/ 05 августа 2008

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

0 голосов
/ 25 марта 2015

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

...