.NET 2.0 ランタイム上の LINQ
質問
LINQ 対応アプリは、.NET 2.0 ランタイムのみがインストールされているマシン上で実行できますか?
理論的には、LINQ は糖衣構文にすぎず、結果として得られる IL コードは .NET 2.0 の場合と同じように見えるはずです。
.NET 3.5 ライブラリを使用せずに LINQ を作成するにはどうすればよいですか?.NET 2.0 上で動作しますか?
解決
3.5 Framework の System.Core.dll を使用して .net 2.0 で実行できるようにする「ハック」がいくつかありますが、個人的には、そのようなやや不安定な基盤は使用したくありません。
ここを参照してください: .NET 2.0 での LINQ サポート
- 新しいコンソール アプリケーションを作成する
- System と System.Core のみを参照アセンブリとして保持します
- System.Core は .NET 2.0 には存在しないため、Copy Local を true に設定します。
- Main メソッドで LINQ クエリを使用します。たとえば以下のもの。
- 建てる
- すべての bin 出力を .NET 2.0 のみがインストールされているマシンにコピーします。
- 走る
(.net 2.0 SP1 が必要ですが、System.Core.dll のバンドルが EULA に違反するかどうかはわかりません)
他のヒント
誰も言及しないのは奇妙だ LINQブリッジ. 。この小さなすばらしいプロジェクトは、LINQ (IEnumerable、ただし IQueryable なし) とその依存関係 (Func、Action など) の .NET 2.0 へのバックポートです。そして:
プロジェクトが編集中にLinqbridgeを参照する場合、Linqbridgeのクエリオペレーターにバインドします。コンピレーション中にsystem.coreを参照すると、フレームワーク3.5のクエリオペレーターにバインドします。
LINQ 固有のアセンブリと依存関係を配布する場合、理論的にはそうです。ただし、これは Microsoft のライセンスに違反します。スコット・ハンセルマンは次のようなブログ投稿を書きました ASP.NET 2.0 への ASP.NET MVC の展開 それはあなたがやりたいことと似ています。
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
短い答え:
- オブジェクトへの LINQ:はい (
IEnumerable<T>
) - LINQ to SQL/エンティティ:いいえ (
IQueryable<T>
) - LINQ to XML/データセット:まだ?
見る この質問 VS2008 から .Net 2.0 をターゲットにする場合に、自動的に、またはほとんど手間をかけずに利用できる .Net 3.5 の機能について説明します。
基本的に、「構文糖」のみで、2.0 互換の IL として出力される新しいコンパイラー (C# 3.0、VB 9.0) はすべて機能します。これには、匿名クラス、匿名デリゲートとしてのラムダ、自動プロパティ、オブジェクト初期化子、コレクション初期化子など、LINQ で使用される多くの機能が含まれます。
一部の LINQ 機能は、新しい 3.5 アセンブリ (System.Core.dll など) に存在するクラス、インターフェイス、デリゲート、および拡張メソッドを使用します。これらのアセンブリの再配布はライセンス違反ですが、再実装することは可能です。拡張メソッドを使用するには、空のメソッドを宣言するだけで済みます。 System.Runtime.CompilerServices.ExtensionAttribute
. 。LINQ to Objects が依存するもの IEnumerable<T>
拡張機能といくつかのデリゲート宣言 ( Action<T>
そして Func<T>
ファミリー) で実装されています。 LINQブリッジ (として マウシュ 言及された)。LINQ to XML と LINQ to DataSet は 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 は構文変換を使用してクエリを実行可能コードに変換します。基本的に、次のようなコードを受け取ります。
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 コード (またはその他の必要なもの) を生成できます。
おそらく 1 日ほどで、独自のバージョンの LINQ to オブジェクトを作成できるでしょう。それはすべて非常に簡単です。
DLINQ を使用する場合は、少し難しくなります。
いいえ、LINQ は実際には単なる構文糖だと思っていましたが、実際には式ツリー (.NET 2.0 には存在しない機能) が多用されているからです。
そうは言っても、.NET 3.5 は .NET 2.0 の上に構築されるだけであり、それが IL が「違う」または「特別」に見えない理由です。
.NET 3.5 Framework をインストールするだけではいけない理由がわかりません。.NET 2.0 はすべて正常に動作します、約束します:)
私の知る限り、LINQ ライブラリはフレームワーク 3.0 以降でのみ利用可能です。フレームワーク 2.0 で同様のものを使用したい場合は、自分で書き直すか、同様のサードパーティ ライブラリを見つける必要があります。ちょっとした情報しか見つけられなかった ここ しかし、それも私には納得できませんでした。
使用できます リンクブリッジ .net 2.0の場合