エンティティフレームワーク-プロジェクションクエリ

エンティティへのLINQ

LINQ to Entitiesを理解するための最も重要な概念の1つは、それが宣言型言語であるということです。焦点は、情報の取得方法ではなく、必要な情報の定義にあります。

  • つまり、データベースへのアクセスなどのタスクを実行するために必要な基になるコードを理解するために、データの操作により多くの時間を費やすことができます。

  • 宣言型言語は実際には開発者から制御を削除しないことを理解することが重要ですが、それは開発者が重要なことに注意を集中するのに役立ちます。

LINQ toEntitiesの必須キーワード

LINQクエリの作成に使用される基本的なキーワードを知っておくことが重要です。覚えておくべきキーワードはごくわずかですが、さまざまな方法で組み合わせて特定の結果を得ることができます。次のリストには、これらの基本的なキーワードが含まれており、それぞれについて簡単に説明しています。

シニア番号 キーワードと説明
1

Ascending

範囲の最小(または最小)要素から範囲の最大要素までソート操作を実行することを指定します。これは通常、デフォルト設定です。たとえば、アルファベット順の並べ替えを実行する場合、並べ替えはAからZの範囲になります。

2

By

グループ化の実装に使用されるフィールドまたは式を指定します。フィールドまたは式は、グループ化タスクを実行するために使用されるキーを定義します。

3

Descending

範囲の最大(または最大)要素から範囲の最小要素までソート操作を実行することを指定します。たとえば、アルファベット順の並べ替えを実行する場合、並べ替えはZからAの範囲になります。

4

Equals

プライマリコンテキストデータソースをセカンダリコンテキストデータソースに結合するために、joinステートメントの左句と右句の間で使用されます。equalsキーワードの左側のフィールドまたは式はプライマリデータソースを指定し、equalsキーワードの右側のフィールドまたは式はセカンダリデータソースを指定します。

5

From

必要な情報を取得するために使用されるデータソースを指定し、範囲変数を定義します。この変数は、ループ内の反復に使用される変数と同じ目的を持っています。

6

Group

指定したキー値を使用して、出力をグループに編成します。複数のグループ句を使用して、複数レベルの出力編成を作成します。グループ句の順序によって、特定のキー値がグループ化の順序で表示される深さが決まります。このキーワードをbyと組み合わせて、特定のコンテキストを作成します。

7

In

さまざまな方法で使用されます。この場合、キーワードはクエリに使用されるコンテキストデータベースソースを決定します。結合を操作する場合、結合に使用されるコンテキストデータベースソースごとにinキーワードが使用されます。

8

Into

join、group、selectなどのLINQクエリ句の参照として使用できる識別子を指定します。

9

Join

マスター/詳細設定など、2つの関連データソースから単一のデータソースを作成します。結合では、内部結合をデフォルトとして、内部結合、グループ結合、または左外部結合を指定できます。結合の詳細については、msdn.microsoft.comを参照してください。

10

Let

部分式の結果をクエリ式に格納するために使用できる範囲変数を定義します。通常、範囲変数は、追加の列挙出力を提供するため、またはクエリの効率を高めるために使用されます(したがって、文字列の小文字の値の検索などの特定のタスクを複数回実行する必要はありません)。

11

On

結合の実装に使用されるフィールドまたは式を指定します。フィールドまたは式は、両方のコンテキストデータソースに共通の要素を定義します。

12

Orderby

クエリの並べ替え順序を作成します。昇順または降順のキーワードを追加して、ソートの順序を制御できます。複数のorderby句を使用して、複数レベルの並べ替えを作成します。orderby句の順序によって、並べ替え式が処理される順序が決まります。そのため、異なる順序を使用すると、出力も異なります。

13

Where

LINQがデータソースから取得するものを定義します。1つ以上のブール式を使用して、取得する対象の詳細を定義します。ブール式は、&&(AND)と||を使用して互いに分離されます。(OR)演算子。

14

Select

返す情報を指定して、LINQクエリからの出力を決定します。このステートメントは、反復プロセス中にLINQが返す要素のデータ型を定義します。

投影

射影クエリは、データベースから特定のフィールドのみを取得することにより、アプリケーションの効率を向上させます。

  • データを取得したら、必要に応じてデータを投影またはフィルタリングして、出力前にデータを整形することができます。

  • LINQ to Entities式の主なタスクは、データを取得して出力として提供することです。

この章の「LINQtoEntitiesクエリの開発」セクションでは、この基本的なタスクを実行するための手法を示しています。

学生のリストが取得される次のコードを見てみましょう。

using (var context = new UniContextEntities()) {

   var studentList = from s in context.Students select s;

   foreach (var student in studentList) {
      string name = student.FirstMidName + " " + student.LastName;
      Console.WriteLine("ID : {0}, Name: {1}", student.ID, name);
   }
}

単一のオブジェクト

単一の学生オブジェクトを取得するには、シーケンスの最初の要素を返すFirst()またはFirstOrDefault列挙可能メソッドを使用できます。FirstとFirstOrDefaultの違いは、指定された基準の結果データがない場合はFirst()が例外をスローするのに対し、結果データがない場合はFirstOrDefault()がデフォルト値nullを返すことです。以下のコードスニペットでは、リストの最初の学生が取得され、その名はAliです。

using (var context = new UniContextEntities()) {

   var student = (from s in context.Students where s.FirstMidName 
      == "Ali" select s).FirstOrDefault<Student>();

   string name = student.FirstMidName + " " + student.LastName;
   Console.WriteLine("ID : {0}, Name: {1}", student.ID, name);
}

Single()またはSingleOrDefaultを使用して、シーケンスの単一の特定の要素を返す単一の学生オブジェクトを取得することもできます。次の例では、IDが2の1人の学生が取得されます。

using (var context = new UniContextEntities()) {

   var student = (from s in context.Students where s.ID 
      == 2 select s).SingleOrDefault<Student>();
   string name = student.FirstMidName + " " + student.LastName;
	
   Console.WriteLine("ID : {0}, Name: {1}", student.ID, name);
   Console.ReadKey();
}

オブジェクトのリスト

名がAliである学生のリストを取得する場合は、ToList()列挙可能メソッドを使用できます。

using (var context = new UniContextEntities()) {

   var studentList = (from s in context.Students where s.FirstMidName 
      == "Ali" select s).ToList();

   foreach (var student in studentList) {
      string name = student.FirstMidName + " " + student.LastName;
      Console.WriteLine("ID : {0}, Name: {1}", student.ID, name);
   }

   Console.ReadKey();
}

注文

特定の順序でデータ/リストを取得するには、orderbyキーワードを使用できます。次のコードでは、学生のスニペットリストが昇順で取得されます。

using (var context = new UniContextEntities()) {

   var studentList = (from s in context.Students orderby
      s.FirstMidName ascending select s).ToList();

   foreach (var student in studentList) {
      string name = student.FirstMidName + " " + student.LastName;
      Console.WriteLine("ID : {0}, Name: {1}", student.ID, name);
   }

   Console.ReadKey();
}

標準とプロジェクションエンティティフレームワークのクエリ

ID、FirstMidName、LastName、およびEnrollmentDateを含むStudentモデルがあるとします。学生のリストを返したい場合、標準のクエリはすべてのフィールドを返します。ただし、ID、FirstMidName、およびLastNameフィールドを含む学生のリストのみを取得したい場合。ここで、プロジェクションクエリを使用する必要があります。以下は、プロジェクションクエリの簡単な例です。

using (var context = new UniContextEntities()) {

   var studentList = from s in context.Students
      orderby s.FirstMidName ascending
      where s.FirstMidName == "Ali"

   select new {s.ID, s.FirstMidName, s.LastName};

   foreach (var student in studentList) {
      string name = student.FirstMidName + " " + student.LastName;
      Console.WriteLine("ID : {0}, Name: {1}", student.ID, name);
   }

   Console.ReadKey();
}

上記のプロジェクションクエリは、EnrollmentDateフィールドを除外します。これにより、アプリケーションがはるかに高速になります。