質問

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 サポート

  1. 新しいコンソール アプリケーションを作成する
  2. System と System.Core のみを参照アセンブリとして保持します
  3. System.Core は .NET 2.0 には存在しないため、Copy Local を true に設定します。
  4. Main メソッドで LINQ クエリを使用します。たとえば以下のもの。
  5. 建てる
  6. すべての bin 出力を .NET 2.0 のみがインストールされているマシンにコピーします。
  7. 走る

(.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の場合

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top