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

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

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

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

5.08.2008 12:03:10
9 ОТВЕТОВ
РЕШЕНИЕ

Есть некоторые «хаки», которые включают использование 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. Пробег

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

34
28.01.2013 04:42:23
Перераспределение System.Core.dll является нарушением лицензии Microsoft
Lucas 19.05.2009 15:51:35
после того, как я собрал и запустил, в папке bin ничего нет, кроме папки отладки. :( Я создаю консольное приложение в .Net 4.0 visual studio 2010.
Jonas T 10.12.2012 12:21:23
@JonasT Если вы используете .net 4.0, то это вообще не относится к вам, поскольку речь идет о .net 2.0 с использованием LINQ. Не стесняйтесь задавать отдельный вопрос, подробно рассказывая о своей настройке.
Michael Stum♦ 10.12.2012 16:21:52
Спасибо, Майкл. Все, что я ищу, это выходные файлы. Я использую .net 2.0. Проблема в том, что я использую Visual Studio 2010, которая не выводит никаких данных в папку bin. Есть ли в любом случае, я могу скачать эти выводы?
Jonas T 19.02.2013 05:58:01
Лицензии и патенты нарушают здравый смысл. Там нет идеи, которая возникла в Microsoft. Все они построены на плечах предыдущих изобретений. Все принадлежит всем, и я надеюсь, что однажды это станет очевидным. Изменение мышления является обязательным, в противном случае мы не можем сделать это как человечество.
Mariusz 12.08.2016 10:00:40

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

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

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

3
5.08.2008 12:07:39
.Net 3.0 или выше не будет установлен на Windows 2000.
Lamar 27.12.2008 04:28:22
примечание: деревья выражений используются IQueryable (как в LINQ to SQL), но не IEnumerbale (как в LINQ to Objects)
Lucas 19.05.2009 15:46:09
Кроме того, в «корпоративном» мире у нас буквально есть машины, которые не были «обновлены» до .NET 2.0. Да. Серьезно, мы делаем.
cbmeeks 10.01.2014 20:52:27
Windows XP требует SP3 для установки .NET 3.0 или выше, и некоторые устройства под управлением Windows XP не так просты для обновления.
Okuma.Scott 4.04.2017 18:50:10

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

11
5.08.2008 12:07:46

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

2
5.08.2008 12:14:33

Я не уверен насчет 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, то все будет немного сложнее.

5
10.10.2008 21:30:37
+1, однако обратите внимание, что деревья выражений (для IQueryable) доступны только в версии 3.5+
Lucas 19.05.2009 15:50:03
... и да, все, что вы сказали о VB 9.0, относится к C # 3.0 (с использованием нового компилятора, но с ориентацией на более старую версию FX)
Lucas 19.05.2009 15:50:41
Но вы можете написать собственную реализацию дерева выражений, если хотите.
Scott Wisniewski 2.12.2009 15:34:57

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

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

79
25.08.2012 09:23:23
+1 Я много этим пользуюсь. Примечание: это реализация LINQ to Objects (расширения IEnumerable), которая отлично работает, если использовать VS2008 (C # 3.0), нацеленную на среду 2.0+. Это НЕ реализация LINQ to SQL или других поставщиков LINQ.
Lucas 19.05.2009 15:48:53
Плохо, что LINQBridge не поддерживает Linq-2-Xml :( Linq-2-Xml делает работу с Xml простой и приятной.
Dmitrii Lobanov 21.03.2011 08:57:10
@Dmitry Linq2Xml - это то, как я выполняю работу так быстро. Xpath - все еще хорошая альтернатива, но не так хорошо.
Jeremy 7.08.2011 06:33:31
Я только что наткнулся на BackLinq raboof.com/projects/backlinq того же автора! Кто-нибудь знает в чем разница или какая последняя?
ala 17.11.2011 00:34:42
@Quandary: Func, Action и «LINQ to objects» очень полезны сами по себе. Лично я использую их намного больше, чем IQueryables.
Mauricio Scheffer 25.08.2012 13:03:57

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

  • 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 к SQL и LINQ для лиц требует много новых классов ( DataContext/ ObjectContext, множество атрибутов, EntitySet<T>, EntityRef<T>, Link<T>, IQueryable<T>, и т.д.) и деревья выражений, которые, даже если каким - то образом переписана, вероятно , потребуется , по крайней мере .Net 2.0 SP1 для работы.

6
23.05.2017 10:30:58

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

7
18.01.2017 10:30:03

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

0
25.03.2015 20:05:40