.NET 2.0 Runtime上的LINQ

启用LINQ的应用程序是否可以在仅安装了.NET 2.0运行时的计算机上运行?

从理论上讲,LINQ只不过是语法糖,结果IL代码看起来应该和.NET 2.0中的一样。

如何在不使用.NET 3.5库的情况下编写LINQ?它会运行在.NET 2.0上吗?

0
额外 编辑
意见: 2

9 答案

有一些“黑客”涉及使用3.5 Framework中的System.Core.dll来使其运行.net 2.0,但我个人不希望使用这样一个有点不稳固的基础。

See here: LINQ support on .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是否违反了EULA)

0
额外
@JonasT如果你使用.net 4.0,那么它就不适用于你,因为它是关于.net 2.0使用LINQ的。随意提出一个单独的问题,提供有关您的设置的详细信息。
额外 作者 Michael Stum,
许可证和专利违反常识。不知道这起源于微软。所有这些都建立在先前发明的肩膀上。一切都属于每个人,我希望有一天它会变得明显。思想的转变是必须的,否则我们不能把它变成人性。
额外 作者 Mariusz,
在我构建并运行后,bin文件夹中除debug文件夹外没有任何内容。 :(我在.NET 4.0 visual studio 2010中构建控制台应用程序。
额外 作者 Jonas T,
谢谢迈克尔。我正在寻找的是输出文件。我正在使用.net 2.0。问题是我正在使用Visual Studio 2010,它不会在bin文件夹中产生任何输出。无论如何,我可以下载这些输出?
额外 作者 Jonas T,
重新分发System.Core.dll是违反Microsoft的许可证
额外 作者 Lucas,

不,因为虽然你认为LINQ实际上只是语法糖,但它实际上大量使用了表达树 - 这是.NET 2.0中缺少的一项功能。

也就是说,.NET 3.5只是建立在.NET 2.0之上,这就是为什么IL看起来“不同”或“特殊”的原因。

我没有看到你不应该只安装.NET 3.5 Framework的原因。一切.NET 2.0将正常工作,承诺:)

0
额外
此外,在“企业”世界中,我们的机器还没有被“升级”为 .NET 2.0 。是。说真的,我们做到了。
额外 作者 cbmeeks,
Windows XP需要SP3才能安装.NET 3.0或更高版本,并且运行Windows XP嵌入式操作系统的某些设备更新并不那么简单。
额外 作者 Okuma.Scott,
注意:IQueryable使用表达式树(如在LINQ to SQL中),但不能使用IEnumerbale(如在LINQ to Objects中)
额外 作者 Lucas,
.Net 3.0或更高版本将不会安装在Windows 2000上。
额外 作者 Lamar,

据我所知,LINQ库仅在框架3.0之后才可用。 如果你想在框架2.0中使用类似的东西,你需要自己重写它:)或找到一个类似的第三方库。我只找到了一些信息这里,但它也没有说服我。

0
额外
框架3.5,实际上,不是3.0
额外 作者 Lucas,

你可以使用单声道的LINQ源代码(.NET for Linux)来获得在.NET 2.0上运行的LINQ。

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

Someone has done it here:
LINQ for .NET 2.0

0
额外

您可以使用.net 2.0的 linqbridge

0
额外

奇怪的是,没有人提到过 LINQBridge 。这个很棒的项目是LINQ(IEnumerable,但没有IQueryable)及其依赖项(Func,Action等)到.NET 2.0的后端。和:

如果您的项目引用了LINQBridge   在编译期间,它会绑定   到LINQBridge的查询操作符;如果它   引用System.Core期间   编译,那么它将绑定到   Framework 3.5的查询操作符。

0
额外
如果它不支持IQueryable(它不),那么有什么意义呢? ? ?
额外 作者 Stefan Steiger,
LINQBridge不支持Linq-2-Xml是很糟糕的:( Linq-2-Xml使得Xml的工作变得简单而好用。
额外 作者 Dmitry Lobanov,
LinqBridge的一个缺点是,当你使用LinqBrige作为他们需要参考System.Core的时候,几乎不可能使用一些好的模拟框架(比如RhinoMocks或Moq)。 RhinoMocks是可用的,但最好的部分是不可用的,因为你不能一次引用System.Core和LinqBridge。
额外 作者 Dmitry Lobanov,
我刚刚遇到同一作者的BackLinq raboof.com/projects/backlinq !有谁知道有什么区别或哪些是最新的?
额外 作者 ala,
@ala:请参阅 code.google.com/p/backlinq :“BackLINQ sources have been并将其合并到LINQBridge项目中并保持其身份,因此,该项目网站已经退役并留在这里进行存档。请关注LINQBridge,以获得进一步更新,贡献和报告问题。
额外 作者 Mauricio Scheffer,
@Quandary:Func,Action和“LINQ to objects”对他们来说非常有用。我个人比IQueryables更多地使用它们。
额外 作者 Mauricio Scheffer,
@DmitryLobanov:真正存在的问题是需要这些库。
额外 作者 Mauricio Scheffer,
@Dmitry Linq2Xml是我如此快速地完成工作。 Xpath仍然是一个很好的选择,但不够流利。
额外 作者 Jeremy,
+1我使用了很多。注意:这是LINQ to Objects(IEnumerable扩展)的实现,如果使用VS2008(C#3.0)目标框架2.0+,则完美工作。它不是LINQ to SQL或其他LINQ提供者的实现。
额外 作者 Lucas,

我不确定C#。

但是,我知道,只要使用VS 2008编译器来定位2.0框架,就可以编写VB LINNQ代码。

但是,您将不得不自己实施一些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);

对于3.5框架附带的LINQ功能,这些方法在IEnumerable或IQueryable(也有一些可用于数据集的方法)上作为扩展方法实现。

默认的IEnumerable扩展方法在System.Linq.Enumerable中定义,如下所示:


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扩展方法将表达式树作为参数,而不是lambda表达式。他们看起来像这样:

 
 public function Select(of T, R)(source as IQueryable, 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,那么事情会变得更加困难。

0
额外
但是如果你喜欢,你可以编写自己的表达式树实现。
额外 作者 Scott Wisniewski,
..是的,你所说的关于VB 9.0的所有内容都适用于C#3.0(使用新的编译器,但是指向旧的fx版本)
额外 作者 Lucas,
+1,但请注意,表达式树(对于IQueryable)仅在3.5+中可用
额外 作者 Lucas,

理论上是的,只要您分发LINQ特定程序集和任何依赖项。但是这违反了微软的许可。 Scott Hanselman写了一篇关于在ASP.NET 2.0上部署ASP.NET MVC 的博客文章类似于你想要做的事情。

0
额外

简短的回答:

  • LINQ to Objects: yes (IEnumerable)
  • LINQ to SQL/Entities: no (IQueryable)
  • LINQ to XML/DataSets: not yet?

请参阅这个问题。当从VS2008定位.Net 2.0时,可以自动或轻松地使用.Net 3.5功能。

基本上,只有“语法糖”和新编译器(C#3.0,VB 9.0)的任何东西都会以兼容2.0的IL发挥作用。这包括LINQ使用的许多特性,例如匿名类,lambda作为匿名委托,自动属性,对象初始值设定项和集合初始值设定项。

Some LINQ features use classes, interfaces, delegates, and extension methods that live in the new 3.5 assemblies (such as System.Core.dll). Redistributing these assemblies is a license violation, but they could be reimplemented. Using extension methods need only that you declare an empty System.Runtime.CompilerServices.ExtensionAttribute. LINQ to Objects relies on IEnumerable extensions and several delegate declarations (the Action and Func families) and have been implemented in LINQBridge (as mausch mentioned). LINQ to xml and LINQ to DataSets rely on LINQ to Objects which I guess could also be implemented for .Net 2.0, but I haven't seen this done yet.

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

0
额外