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

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

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
60
0
55 165
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

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

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

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

.Net 3.0 или выше не устанавливается на Windows 2000.

Lamar 27.12.2008 07:28

примечание: деревья выражений используются IQueryable (как в LINQ to SQL), но не IEnumerbale (как в LINQ to Objects)

Lucas 19.05.2009 19:46

Кроме того, в «корпоративном» мире у нас буквально есть машины, которые не были «модернизированы» до .NET 2.0. Да. Серьезно, делаем.

cbmeeks 11.01.2014 00:52

Windows XP требует SP3 для установки .NET 3.0 или выше, а некоторые устройства со встроенной Windows XP обновить не так-то просто.

Scott Solmer 04.04.2017 21:50
Ответ принят как подходящий

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

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

  1. Create a new console application
  2. Keep only System and System.Core as referenced assemblies
  3. Set Copy Local to true for System.Core, because it does not exist in .NET 2.0
  4. Use a LINQ query in the Main method. For example the one below.
  5. Build
  6. Copy all the bin output to a machine where only .NET 2.0 is installed
  7. Run

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

распространение System.Core.dll является нарушением лицензии Microsoft

Lucas 19.05.2009 19:51

после того, как я собрал и запустил, в папке bin нет ничего, кроме папки отладки. :( Я создаю консольное приложение в Visual Studio 2010 .Net 4.0.

Jonas T 10.12.2012 16:21

@JonasT Если вы используете .net 4.0, то это к вам вообще не относится, поскольку речь идет о .net 2.0 с использованием LINQ. Не стесняйтесь задать отдельный вопрос, подробно описав вашу настройку.

Michael Stum 10.12.2012 20:21

Спасибо, Майкл. Все, что я ищу, это выходные файлы. Я использую .net 2.0. Проблема в том, что я использую Visual Studio 2010, который не выводит никаких данных в папку bin. Могу ли я как-нибудь загрузить эти результаты?

Jonas T 19.02.2013 09:58

Лицензии и патенты нарушают здравый смысл. Понятия не имею, что это зародилось в Microsoft. Все они построены на плечах предыдущих изобретений. Все принадлежит всем, и я надеюсь, что однажды это станет очевидным. Изменение мышления - необходимость, иначе мы не сможем сделать это как человечество.

Mariusz 12.08.2016 13:00

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

Насколько мне известно, библиотека LINQ доступна только с версии 3.0. Если вы хотите использовать что-то подобное во фреймворке 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, все будет немного сложнее.

+1, однако обратите внимание, что деревья выражений (для IQueryable) доступны только в 3.5+

Lucas 19.05.2009 19:50

.. и да, все, что вы сказали о VB 9.0, применимо к C# 3.0 (с использованием нового компилятора, но с ориентацией на более старую версию fx)

Lucas 19.05.2009 19:50

Но вы можете написать свою собственную реализацию дерева выражений, если хотите.

Scott Wisniewski 02.12.2009 18:34

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

If your project references LINQBridge during compilation, then it will bind to LINQBridge's query operators; if it references System.Core during compilation, then it will bind to Framework 3.5's query operators.

+1 Я много этим пользуюсь. Примечание: это реализация LINQ to Objects (расширения IEnumerable), отлично работает при использовании платформы таргетинга VS2008 (C# 3.0) 2.0+. Это НЕ реализация LINQ to SQL или других поставщиков LINQ.

Lucas 19.05.2009 19:48

Плохо, что LINQBridge не поддерживает Linq-2-Xml :( Linq-2-Xml делает работу с Xml простой и приятной.

Dmitrii Lobanov 21.03.2011 11:57

@Dmitry Linq2Xml - это то, как я так быстро выполняю работу. Xpath по-прежнему является хорошей альтернативой, но не так свободно.

Jeremy 07.08.2011 10:33

Я только что наткнулся на BackLinq raboof.com/projects/backlinq того же автора! Кто-нибудь знает, в чем разница или какая последняя?

ala 17.11.2011 04:34

@ala: см. code.google.com/p/backlinq: «Источники BackLINQ были скомпилированы и объединены в проект LINQBridge и поддерживаются под его именем. В результате этот сайт проекта был удален и оставлен здесь для архивных целей. Следите за LINQBridge для дальнейших обновлений, дополнений и сообщение о проблемах ".

Mauricio Scheffer 17.11.2011 04:38

Единственный недостаток LinqBridge заключается в том, что при использовании LinqBridge практически невозможно использовать какую-либо хорошую среду фиксации (например, RhinoMocks или Moq) на полную мощность, поскольку им нужна ссылка на System.Core. RhinoMocks можно использовать, но его лучшая часть недоступна, так как вы не можете ссылаться на System.Core и LinqBridge одновременно.

Dmitrii Lobanov 21.02.2012 04:40

@DmitryLobanov: настоящая проблема - это нуждающийся этих библиотек.

Mauricio Scheffer 21.02.2012 05:19

Если он не поддерживает IQueryable (не поддерживает), тогда в чем смысл? ? ?

Stefan Steiger 25.08.2012 13:18

@Quandary: Func, Action и «LINQ to objects» очень полезны сами по себе. Лично я использую их много больше, чем IQueryables.

Mauricio Scheffer 25.08.2012 17:03

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

  • 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 (как упоминалось в 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 работать.

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

Другие вопросы по теме