.NET 2.0运行时上的LINQ

Asked
Viewd54369

60

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

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

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

8 个答案

34

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

请参阅此处: LINQ支持

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

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

11

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

79

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

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

  • +1 I use this a lot. Note: this is an implementation of LINQ to Objects (the IEnumerable extensions), works perfectly if using VS2008 (C# 3.0) targeting framework 2.0+. It is NOT an implementation of LINQ to SQL or other LINQ providers.

    LucasMay 19, 2009 15:48
3

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

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

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

2

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

5

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