.NET 2.0运行时上的LINQ

Translate

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

从理论上讲,LINQ只是语法糖,而且生成的IL代码应与.NET 2.0中的外观相同。

不使用.NET 3.5库,如何编写LINQ?它可以在.NET 2.0上运行吗?

This question and all comments follow the "Attribution Required."

所有的回答

Translate

有一些“难题”涉及使用3.5框架中的System.Core.dll使其与.net 2.0一起运行,但是我个人不希望使用这样有些不稳定的基础。

看这里:.NET 2.0上的LINQ支持

  1. 创建一个新的控制台应用程序
  2. 仅将System和System.Core保留为引用的程序集
  3. 将System.Core的Copy Local设置为true,因为它在.NET 2.0中不存在
  4. 在Main方法中使用LINQ查询。例如下面的一个。
  5. 建立
  6. 将所有bin输出复制到仅安装.NET 2.0的计算机上

(需要.net 2.0 SP1,我不知道捆绑System.Core.dll是否违反EULA)

来源
Translate

没有人提到这很奇怪LINQBridge。这个小巧的项目是LINQ(IEnumerable,但没有IQueryable)及其依赖项(Func,Action等)向.NET 2.0的反向移植。和:

如果您的项目在编译期间引用LINQBridge,则它将绑定到LINQBridge的查询运算符;如果在编译期间引用System.Core,则它将绑定到Framework 3.5的查询运算符。

来源
Translate

从理论上讲,是的,只要您分发LINQ特定的程序集和任何依赖项即可。但是,这违反了Microsoft的许可。 Scott Hanselman写了一篇有关在ASP.NET 2.0上部署ASP.NET MVC这与您要执行的操作类似。

来源
Translate

您可以使用mono(来自Linux的.NET)中的LINQ源来使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

有人在这里做过:
NET的LINQ

来源
Translate

简短答案:

  • LINQ to Objects:是 (IEnumerable<T>)
  • LINQ to SQL /实体:否 (IQueryable<T>)
  • LINQ to XML / DataSets:还没有?

看到这个问题从VS2008定位.Net 2.0时,有关.Net 3.5功能自动可用或不费吹灰之力的信息。

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

某些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 to SQL和LINQ to Entities需要许多新类(DataContext/ObjectContext,很多属性,EntitySet<T>, EntityRef<T>, Link<T>, IQueryable<T>等)和表达式树(即使以某种方式重新实现了)也可能至少需要.Net 2.0 SP1才能正常工作。

来源
Translate

我不确定C#。

但是,我确实知道,只要使用VS 2008编译器以2.0框架为目标,就可以编写不带3.5库的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中定义,如下所示:

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

 <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,那么事情会有些困难。

来源
Translate

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

话虽如此,.NET 3.5仅建立在.NET 2.0的基础上,这就是IL看起来不“不同”或“特殊”的原因。

我看不出为什么不应该仅安装.NET 3.5 Framework的原因。 .NET 2.0一切都可以正常运行,承诺:)

来源
Translate

据我所知,LINQ库仅自框架3.0起可用。如果要在Framework 2.0中使用类似的内容,则需要自己重新写它:)或找到类似的第三方库。我只发现了一些信息这里但它也没有说服我。

来源
Translate

您可以使用林克布里奇适用于.net 2.0

来源