LINQ在.NET 2.0运行时
启用了LINQ的应用程序是否可以在仅安装了.NET 2.0运行时的计算机上运行?
从理论上讲,LINQ只不过是语法糖,所得到的IL代码看起来应该和.NET 2.0一样。
我如何编写LINQ而不使用.NET 3.5库? 它会在.NET 2.0上运行吗?
有一些“黑客”,涉及使用3.5 Framework的System.Core.dll使其运行与.net 2.0,但个人,我不希望使用这样一个有点不稳固的基础。
看到这里: .NET 2.0的LINQ支持
- 创build新的控制台应用程序
- 只保留System和System.Core作为引用程序集
- 将System.Core的Copy Local设置为true,因为它在.NET 2.0中不存在
- 在Main方法中使用LINQ查询。 例如下面的一个。
- build立
- 将所有bin输出复制到仅安装了.NET 2.0的机器上
- 跑
(需要.net 2.0 SP1,我不知道如果捆绑System.Core.dll违反了EULA)
很奇怪,没有人提到LINQBridge 。 这个很棒的项目是LINQ(IEnumerable,但没有IQueryable)及其依赖项(Func,Action等)到.NET 2.0的反向链接。 和:
如果你的项目在编译时引用了LINQBridge,那么它将绑定到LINQBridge的查询操作符; 如果它在编译期间引用System.Core,那么它将绑定到Framework 3.5的查询运算符。
理论上是的,只要你分发LINQ特定的程序集和任何依赖关系。 但是这违反了微软的许可。 Scott Hanselman写了一篇关于在ASP.NET 2.0上部署ASP.NET MVC的博客文章,与您想要的类似。
你可以使用单声道的LINQ源代码(.NET for Linux)来获得运行在.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
简短的回答:
- LINQ到对象:是 (
IEnumerable<T>
) - LINQ to SQL / Entities:no (
IQueryable<T>
) - LINQ to XML / DataSets:还没有?
看到这个问题关于.Net 3.5function自动或几乎毫不费力地从VS2008瞄准.Net 2.0。
基本上,只有“语法糖”和新编译器(C#3.0,VB 9.0)的任何东西都会以兼容2.0的IL发挥作用。 这包括LINQ所使用的许多特性,例如匿名类,作为匿名委托的lambdaexpression式,自动属性,对象初始值设定项和集合初始值设定项。
一些LINQfunction使用新的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>
等)和expression式树,即使以某种方式重新实现,可能需要至less.Net 2.0 SP1的工作。
我不确定C#。
但是,我知道,只要使用VS 2008编译器来定位2.0框架,就可以编写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框架附带的LINQfunction,这些方法在IEnumerable或IQueryable(也有一些在数据集上工作的方法)上作为扩展方法实现。
System.Linq.Enumerable中定义了默认的IEnumerable扩展方法,如下所示:
<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扩展方法将expression式树作为参数,而不是lambdaexpression式。 他们看起来像这样:
<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
expression式树版本使您能够获得提供给子句的expression式的树形表示,然后可以使用该子句生成SQL代码(或者您想要的任何东西)。
大概一天左右,你可以创build自己的LINQ版本的对象。 这非常简单。
如果你想使用DLINQ,那么事情会更加困难。
不,因为当你认为LINQ实际上只是语法糖时,它实际上大量使用了expression式树 – 在.NET 2.0中没有的function。
也就是说,.NET 3.5只是build立在.NET 2.0之上,这就是为什么IL看起来不是“不同”或“特殊”的原因。
我没有看到你不应该只安装.NET 3.5 Framework的原因。 一切.NET 2.0将正常工作,答应:)
据我所知,LINQ库仅在框架3.0以后才可用。 如果你想在框架2.0中使用类似的东西,你需要自己重写:)或者find一个类似的第三方库。 我只在这里find了一些信息,但是也没有使我相信。
您可以使用linqbridge .net 2.0