質問

LINQは.NET 4.0の新機能であり、.NET 3.5などの古いバージョンではサポートされていませんか?それは何に役立ちますか?式ツリーを構築できるようです。実際、式ツリーとは何ですか? LINQはC#ファイルからクラス、メソッド、フィールドなどの情報を抽出できますか?

LINQで何ができるかを示すために、誰かが実際のコードを提供してくれますか?

役に立ちましたか?

解決

LINQ は、組み込みの.NET 3.5機能です。 C#3.0およびVisual Basic 2008からの言語サポート。多くの MSDNの例

他のヒント

Linqは.Net 3.5で追加されました(同じリリースでC#3.0コンパイラに追加され、VB.netコンパイラにわずかに制限された形式で追加されました)

Inは言語統合クエリですが、これを実現するために言語とランタイムの両方に追加される多くの複雑な追加機能をカバーしていますが、これらはそれ自体で有用です。

式機能は、実行時に、プログラムに渡された特定のコード構成の抽象的な構文を検査する機能を単に置くだけです。これらはラムダと呼ばれます。そして、本質的には、匿名関数をより簡単に記述し、その構造の実行時イントロスペクションを容易にする方法です。

Linqに最も密接に関連付けられている「SQLのような」機能(決して1つではありません)は、Linq to Sqlと呼ばれ、次のようなものです:

from f in Foo where s.Blah == "wibble" select f.Wobble;
クエリを実行するだけのコードではなく、

このクエリの表現にコンパイルされます。 linq to sqlにする部分は、それをsqlに変換する「バックエンド」です。このため、式はsqlサーバーステートメントに変換され、行から.netオブジェクトへのマッピングと、c#ロジックの同等のwhere句への変換により、リンクされたデータベースに対してクエリを実行します。 Fooがプレーンな.netオブジェクトのコレクション(その時点で<!> quot; Linq to objects <!> quot;)である場合、まったく同じコードを適用できます。その後、式の変換はストレート.Netコードになります。 。

上記の言語統合方法で記述されたラムダは、実際には次のものと同等です:

Foo.Where(f = <!> gt; f.Blah == <!> quot; wibble).Select(f = <!> gt; f.Wobble);

Fooが型付きコレクションである場合。データベースの場合、クラスはデータベースの値を表すように合成され、これによりコンパイルとSQLエリアから.netエリアへ、またはその逆の値の往復が可能になります。

Linqの Language Integrated 部分の重要な側面は、結果の言語コンストラクトが結果のコードの第一級部分であることです。単純に関数を生成するのではなく、プログラムの他の側面が関数を操作できるように、関数が(式として)構築された方法を提供します。

この機能の消費者は、単にそれを実行する(ラムダがコンパイルされる関数を実行する)か、それを説明する式を求めてから、それを使って何かを行うことを選択できます。

これを可能にするものの多くの側面は、<!> quot; Linq <!> quot;の下に置かれます。バナーは実際にはLinqのテーマではありません。
たとえば、projection(可能なプロパティのサブセットを選択する)を簡単に使用するには匿名型が必要ですが、Linqの外部でも匿名型を使用できます。

Linq、特にラムダ(これにより、構文に関して匿名デリゲートの作成が非常に軽量になります)により、c#の機能が向上しました。これは、多くの関数言語のIEnumerable<T>に対応するSelect()などのmapの拡張メソッドと、filterに対応するWhere()によって強化されています。匿名型のように、これはそれ自体ではありません<!> quot; Linq <!> quot;ただし、多くの人がc#開発に非常に有益な効果があると考えています(これは普遍的なビューではありませんが、広く行われています)。

式はより高度なトピックであり、理解するこれらのngは、linqを使用するのにまったく不要です。ただし、特定の「トリック」を使用することは可能です。 一般的に、関数ではなく式を取得し、それを使用して外部データソースと通信するなど、単純な関数が行うこと以外の何かを行うコードであるlinqプロバイダーを作成しようとする場合にのみ、式を気にします。

他の用途は、関数の内部が何をしているかについてメタデータを取得したい場合、おそらく式をコンパイルし(関数として式を実行できるデリゲートが得られる)、何かをする場合ですそれを使用するか、オブジェクトのメタデータを参照して、コンパイル時にこの回答はを示しています。

まだ取り上げられていないこの質問の1つの領域は、式ツリーです。 こちら

式ツリーを作成する他の重要なことは、式ツリーを構築して自分がやろうとしていることを定義することで、実際にする必要がないことです。何でもする。遅延実行について言及しています。

//this code will only build the expression tree
var itemsInStock = from item in warehouse.Items
                   where item.Quantity > 0;

// this code will cause the actual execution
Console.WriteLine("Items in stock: {0}", itemsInStock.Count());

LINQは.NET 3.5で導入されました。 このサイトには多くの例があります。

これについては、 SOのこちらでもかなり詳しく説明しています。

System.Linq.Expressionsは、式ツリーを手動で作成(または機械生成)するためのものです。この名前空間が使用されているより複雑な機能を構築する複雑さを考えると、私は感じています。しかし、それは非常に強力です。たとえば、私の同僚の1人は最近、累積密度関数を使用して任意のLINQ to SQLオブジェクトを自動スケーリングできる式ツリーを実装しました。すべての列は、非常に高速にコンパイルされるツリーを取得します。基本的な機能を実装するだけでなく、生成されたコードの残りを一緒に接着するためにそれらを広範囲に使用する特殊なコンパイラを構築しています。

このブログ投稿で詳細とアイデアをご覧ください。

ここに多くのLinqの例があります:
http://msdn.microsoft.com/en-us/vcsharp/aa336746。 aspx

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