61

Can a LINQ enabled app run on a machine that only has the .NET 2.0 runtime installed?

In theory, LINQ is nothing more than syntactic sugar, and the resulting IL code should look the same as it would have in .NET 2.0.

How can I write LINQ without using the .NET 3.5 libraries? Will it run on .NET 2.0?

4

8 に答える 8

81

誰もLINQBridgeについて言及していないのは奇妙です。この小さな素晴らしいプロジェクトは、LINQ (IEnumerable、ただし IQueryable なし) とその依存関係 (Func、Action など) を .NET 2.0 にバックポートしたものです。と:

プロジェクトがコンパイル中に LINQBridge を参照する場合、LINQBridge のクエリ演算子にバインドされます。コンパイル中に System.Core を参照すると、Framework 3.5 のクエリ演算子にバインドされます。

于 2008-12-27T02:51:12.903 に答える
34

There are some "Hacks" that involve using a System.Core.dll from the 3.5 Framework to make it run with .net 2.0, but personally I would not want use such a somewhat shaky foundation.

See here: LINQ support on .NET 2.0

  1. Create a new console application
  2. Keep only System and System.Core as referenced assemblies
  3. Set Copy Local to true for System.Core, because it does not exist in .NET 2.0
  4. Use a LINQ query in the Main method. For example the one below.
  5. Build
  6. Copy all the bin output to a machine where only .NET 2.0 is installed
  7. Run

(Requires .net 2.0 SP1 and I have no idea if bundling the System.Core.dll violates the EULA)

于 2008-08-05T12:07:41.603 に答える
11

理論的には、LINQ 固有のアセンブリと依存関係を配布すれば、はい。ただし、これは Microsoft のライセンスに違反しています。Scott Hanselman は、 ASP.NET 2.0 での ASP.NET MVC の展開に関するブログ投稿を書きました。これは、あなたがやりたいことと似ています。

于 2008-08-05T12:07:46.190 に答える
7

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

于 2011-03-04T18:51:25.560 に答える
6

簡潔な答え:

  • オブジェクトへの 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 で使用される多くの機能が含まれます。

一部の 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 が必要になるでしょう。

于 2009-05-19T16:19:19.070 に答える
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 拡張メソッドは、ラムダではなく式ツリーを引数として受け取ります。それらは次のようになります。

 <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 を約 1 日ほどで作成できます。それはすべて非常に簡単です。

DLINQ を使用する場合は、少し難しくなります。

于 2008-10-10T21:30:37.693 に答える
3

No, because while you thought LINQ is really just syntactic sugar, it actually heavily used expression trees -- a feature absent in .NET 2.0.

That being said .NET 3.5 only builds up on top of .NET 2.0, and that's the reason why the IL doesn't look "different" or "special".

I do not see a reason why you shouldn't just install the .NET 3.5 Framework. Everything .NET 2.0 will work fine on it, promise :)

于 2008-08-05T12:07:39.000 に答える
2

私が知る限り、LINQ ライブラリはフレームワーク 3.0 以降でしか利用できません。フレームワーク 2.0 で同様のものを使用したい場合は、自分で書き直す必要があります :) または、同様のサードパーティ ライブラリを見つけます。ここで少しだけ情報を見つけましたが、それも納得できませんでした。

于 2008-08-05T12:14:33.197 に答える