C#でプロジェクションを使用する方法
射影は、クエリの結果を変換する操作です。射影を使用して、アプリケーションで必要なプロパティのみを持つ新しいフォームにオブジェクトを変換できます。この記事では、C#でプロジェクションを操作する方法を見ていきます。
この記事で提供されているコード例を使用するには、システムにVisual Studio2019がインストールされている必要があります。まだコピーをお持ちでない場合は、こちらからVisual Studio2019をダウンロードできます。
VisualStudioでコンソールアプリケーションプロジェクトを作成します
まず、VisualStudioで.NETCoreコンソールアプリケーションプロジェクトを作成しましょう。Visual Studio 2019がシステムにインストールされていると仮定して、以下に概説する手順に従って、VisualStudioで新しい.NETCoreコンソールアプリケーションプロジェクトを作成します。
- Visual StudioIDEを起動します。
- 「新しいプロジェクトの作成」をクリックします。
- 「新規プロジェクトの作成」ウィンドウで、表示されたテンプレートのリストから「コンソールアプリ(.NETCore)」を選択します。
- [次へ]をクリックします。
- 次に表示される[新しいプロジェクトの構成]ウィンドウで、新しいプロジェクトの名前と場所を指定します。
- [作成]をクリックします。
- これにより、Visual Studio2019で新しい.NETCoreコンソールアプリケーションプロジェクトが作成されます。このプロジェクトは、この記事の後続のセクションで使用します。
C#での投影とは何ですか?
投影とは、新しく作成されたオブジェクトに使用されるプロパティのみが含まれるように、オブジェクトを新しい形式に変換する行為を指します。統合言語クエリ(LINQ)は、SelectとSelectManyの2つの標準クエリ射影演算子をサポートします。
SelectおよびSelectMany演算子を使用して、単一のプロパティを投影したり、クエリの結果を投影したり、データソースから匿名タイプに複数のプロパティを投影したりできます。必要に応じて、プロジェクションに対して計算、フィルタリング、またはその他の操作を実行することもできます。
次のセクションでは、C#でこれらの演算子を操作する方法を検討します。
C#でSelect演算子を使用してプロジェクトを作成する
Program.csファイル内に次のコードを記述します。
パブリッククラス作成者{{
public int Id {get; セットする; }
public string FirstName {get; セットする; }
パブリック文字列LastName {get; セットする; }
パブリック文字列アドレス{取得; セットする; }
public Author(int id、string firstName、
文字列lastName、文字列アドレス)
{{
this.Id = id;
this.FirstName = firstName;
this.LastName = lastName;
this.Address =アドレス;
}
}
次のコードスニペットは、Select演算子を利用してデータをクエリする方法を示しています。
var authors =新しいリスト{{
new Author(1、 "Joydip"、 "Kanjilal"、 "Hyderabad、INDIA")、
new Author(2、 "Anand"、 "Naraswamy"、 "Cochin、INDIA")、
new Author(3、 "Steve"、 "Smith"、 "Ohio、USA")、
new Author(4、 "Uday"、 "Denduluri"、 "London、UK")
};
foreach(著者の変数名.Select(e => e.FirstName))
{{
Console.WriteLine(name);
}
上記のコードスニペットを実行すると、すべての作成者の名がコンソールウィンドウに表示されます。
C#で匿名タイプに投影する
データソースから複数のプロパティを投影できます。匿名タイプに投影することもできます。次のコードスニペットは、複数のプロパティを匿名型に投影する方法を示しています。
var data = authors.Select(e => new {e.FirstName、e.LastName});
C#でSelectMany演算子を使用してプロジェクトを作成する
SelectMany演算子を利用して、IEnumerableインターフェイスを実装するコレクションからデータをクエリできます。複数のコレクションからデータをクエリして、それらを単一のシーケンスに投影またはフラット化する場合は、SelectMany演算子を使用できます。
SelectとSelectManyはどちらも、ソース値から結果を生成することに注意してください。Selectは各ソース値から単一の結果を生成しますが、SelectManyは各ソース値から連結されたサブコレクションを生成します。
次に、Subjectsという名前のAuthorクラスに追加のプロパティを含めましょう。このプロパティは、著者が本を書いている主題の名前を含む文字列のリストです。
パブリッククラス作成者{{
public int Id {get; セットする; }
public string FirstName {get; セットする; }
パブリック文字列LastName {get; セットする; }
パブリック文字列アドレス{取得; セットする; }
パブリックリストサブジェクト{取得; セットする; }
public Author(int id、string firstName、string lastName、
文字列アドレス、件名のリスト)
{{
this.Id = id;
this.FirstName = firstName;
this.LastName = lastName;
this.Address =アドレス;
this.Subjects =サブジェクト;
}
}
次のコードスニペットを使用して、作成者のリストを作成できます。
var authors =新しいリスト{{
new Author(1、 "Joydip"、 "Kanjilal"、 "Hyderabad、INDIA"、
新しいリスト{"C#"、 "F#"})、
new Author(2、 "Anand"、 "Naraswamy"、 "Cochin、INDIA"、
新しいリスト{"C#"、 "VB.NET"})、
new Author(3、 "Steve"、 "Smith"、 "Ohio、USA"、
新しいリスト{"C#"、 "C ++"})、
new Author(4、 "Uday"、 "Denduluri"、 "London、UK"、
新しいリスト{"C#"、 "VB.NET"})、
new Author(5、 "Jane"、 "Barlow"、 "London、UK"、
新しいリスト{"C#"、 "C ++"})
};
また、以下のコードスニペットを使用して、著者が本を書いているプログラミング言語の名前を取得できます。
var data = authors.SelectMany(a => a.Subjects).Distinct();foreach(データ内のvarサブジェクト)
{{
Console.WriteLine(subject);
}
Where演算子を使用して、C#の結果データをフィルタリングします
SelectManyの後にWhere演算子を適用して、結果セットをフィルタリングできます。次のコードスニペットを実行すると、FirstNameと、FirstNameが文字「J」で始まり英国に居住する作成者の件名が表示されます。
var data = authors.Where(a => a.Address.IndexOf( "UK")> = 0)
.SelectMany(a => a.Subjects、(a、Subject)=> new {a.FirstName、Subject})
.Where(n => n.FirstName.StartsWith( "J"));
foreach(データ内のvar作成者)
{{
Console.WriteLine(作成者);
}
上記のコードスニペットを実行すると、下の画面イメージに示すように、コンソールウィンドウに出力が表示されます。

EF Coreを使用する場合はプロジェクションを使用できるため、アプリケーションに必要な基になるデータベースから列のみを取得できます。ここでの今後の記事では、1対多のプロジェクション、結果のフィルタリング、順序付けなど、プロジェクションを使用したいくつかの高度な操作について説明します。