Entity-framework-projection-queries

提供:Dev Guides
移動先:案内検索

Entity Framework-投影クエリ

エンティティへのLINQ

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

  • つまり、データベースへのアクセスなどのタスクを実行するために必要な基礎となるコードを把握しようとする時間を短縮し、データの操作により多くの時間を費やすことができます。 *宣言型言語は実際には開発者からコントロールを削除しないことを理解することが重要ですが、開発者が重要なことに注意を集中するのに役立ちます。

LINQ to Entities Essential Keywords

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

Sr. No. Keyword & Description
1
  • Ascending*

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

2

By

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

3

Descending

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

4

Equals

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

5

From

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

6

Group

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

7

In

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

8

Into

結合、グループ、選択などのLINQクエリ句の参照として使用できる識別子を指定します。

9

Join

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

10

Let

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

11

On

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

12

Orderby

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

13

Where

LINQがデータソースから取得するものを定義します。 1つ以上のブール式を使用して、取得する内容の詳細を定義します。 ブール式は、&&(AND)および

を使用して互いに分離されます。 (OR)演算子。
14

Select

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

投影

投影クエリは、データベースから特定のフィールドを取得するだけで、アプリケーションの効率を向上させます。

  • データを取得したら、必要に応じてデータを投影またはフィルタリングして、出力前にデータを整形できます。
  • LINQ to Entities式の主なタスクは、データを取得して出力として提供することです。

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

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

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の単一の学生が取得されます。

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フィールドが除外されています。 これにより、アプリケーションがはるかに高速になります。