.NET 2.0运行时的LINQ

时间:2008-08-05 12:03:11

标签: .net linq .net-3.5 .net-2.0 clr

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

从理论上讲,LINQ只不过是语法糖,而得到的IL代码应该与.NET 2.0中的代码相同。

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

9 个答案:

答案 0 :(得分:77)

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

  

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

答案 1 :(得分:33)

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

见这里:LINQ support on .NET 2.0

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

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

答案 2 :(得分:11)

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

答案 3 :(得分:7)

您可以使用mono(Linux for Linux)中的LINQ源来在.NET 2.0上运行LINQ。

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 for .NET 2.0

答案 4 :(得分:6)

简短回答:

  • LINQ to Objects:是IEnumerable<T>
  • LINQ to SQL / Entities:no IQueryable<T>
  • LINQ to XML / DataSet:尚未?

在VS2008中定位.Net 2.0时,请参阅this question有关.Net 3.5自动提供的功能,或者只需很少的工作。

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

某些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>,{ {1}}等)和表达式树,即使以某种方式重新实现,也可能至少需要.Net 2.0 SP1才能工作。

答案 5 :(得分:5)

我不确定C#。

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

但是,您必须实现一些自己的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扩展方法将表达式树作为参数,而不是lambdas。它们看起来像这样:

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

答案 6 :(得分:3)

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

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

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

答案 7 :(得分:2)

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

答案 8 :(得分:0)

您可以将linqbridge 用于.net 2.0