.NET 2.0运行时上的LINQ

.NET 2.0运行时上的LINQ

LINQ on the .NET 2.0 Runtime

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

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

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


没人提到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.


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

参见此处:.NET 2.0上的LINQ支持

  • Create a new console application
  • Keep only System and System.Core as referenced assemblies
  • Set Copy Local to true for System.Core, because it does not exist in .NET 2.0
  • Use a LINQ query in the Main method. For example the one below.
  • Build
  • Copy all the bin output to a machine where only .NET 2.0 is installed
  • Run
  • (需要.net 2.0 SP1,并且我不知道捆绑System.Core.dll是否违反了EULA)


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


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

    1
    2
    3
    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


    简短答案:

    • LINQ到对象:是(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中实现(如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才能正常工作。


    我不确定C#。

    但是,我确实知道,只要使用VS 2008编译器以2.0框架为目标,就可以编写不带3.5库的VB LINNQ代码。

    但是,您将必须自己实现一些LINQ方法。

    LINQ使用语法转换将查询转换为可执行代码。基本上,它将采用如下代码:

    1
    dim q = from x in xs where x > 2 select x*4;

    并将其转换为如下代码:

    1
    dim q = xs.where(function(x) x > 2).select(function(x) x * 4);

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

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

    1
    2
    3
    4
    5
    6
    <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作为参数。他们看起来像这样:

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


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

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

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


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


    您可以将linqbridge用于.net 2.0


    推荐阅读