代码之家  ›  专栏  ›  技术社区  ›  urini

.NET2.0运行时上的LINQ

  •  55
  • urini  · 技术社区  · 17 年前

    从理论上讲,LINQ只不过是一种语法上的糖分,由此产生的IL代码应该与.NET2.0中的代码相同。

    如何在不使用.NET3.5库的情况下编写LINQ?它会在.NET2.0上运行吗?

    9 回复  |  直到 17 年前
        1
  •  81
  •   Stefan Steiger Marco van de Voort    13 年前

    奇怪的是没人提到 LINQBridge . 这个非常棒的小项目是LINQ(IEnumerable,但没有IQueryable)及其对.NET2.0的依赖(Func、Action等)的一个后端口。以及:

    到LINQBridge的查询运算符;如果是 参考系统 框架3.5的查询运算符。

        2
  •  34
  •   Michael Stum    13 年前

    有一些“黑客”涉及使用Stask.Cy.DLL从3.5框架,使它运行与.NET 2,但我个人不希望使用这样一个有点动摇的基础。

    请看这里: LINQ support on .NET 2.0

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

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

        3
  •  11
  •   John Downey    17 年前

    理论上是的,前提是您分发特定于LINQ的程序集和任何依赖项。然而,这违反了微软的授权。Scott Hanselman写了一篇关于 Deploying ASP.NET MVC on ASP.NET 2.0 这和你想做的事情很相似。

        4
  •  7
  •   Stefan Steiger Marco van de Voort    6 年前

    您可以使用mono(.NET 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

        5
  •  6
  •   Community Mohan Dere    9 年前

    简短答复:

    • ( IEnumerable<T>
    • IQueryable<T> )
    • LINQ到XML/数据集:还没有?

    this question

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

    一些LINQ特性使用新3.5程序集中的类、接口、委托和扩展方法(如System.Core.dll)。重新分发这些程序集违反了许可证,但可以重新实现。使用扩展方法只需要声明一个空 System.Runtime.CompilerServices.ExtensionAttribute . LINQ到对象依赖于 Action<T> Func<T> 家庭),并已在 LINQBridge mausch 提及)。LINQtoXML和LINQtoDataSet依赖于LINQtoObject,我想这也可以在.NET2.0中实现,但我还没有看到这样做。

    LINQtoSQL和LINQtoEntities需要许多新类( DataContext ObjectContext ,很多属性, EntitySet<T> , EntityRef<T> Link<T> IQueryable<T> ,等等)和表达式树,即使以某种方式重新实现,也可能至少需要.NET2.0SP1才能工作。

        6
  •  5
  •   Scott Wisniewski    17 年前

    我不确定C。

    但是,您必须自己实现一些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
    

     <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 to对象。一切都很直截了当。

        7
  •  3
  •   Jon Limjap    17 年前

    不,因为虽然您认为LINQ实际上只是语法糖,但它实际上大量使用了表达式树——这是.NET2.0中缺少的特性。

    也就是说.NET3.5只是建立在.NET2.0之上,这就是为什么IL看起来没有“不同”或“特殊”的原因。

        8
  •  2
  •   jdecuyper    17 年前

    据我所知,LINQ库仅在framework 3.0之后才可用。 here 但这也没能说服我。