Entity-framework-eager-loading

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

Entity Framework-Eager Loading

積極的な読み込みとは、あるタイプのエンティティに対するクエリが、クエリの一部として関連するエンティティも読み込むプロセスです。 積極的な読み込みは、* Includeメソッド*を使用して実現されます。

これは、関連データのリクエストがデータベースからのクエリ結果とともに返されることを意味します。 データソースへの接続は1つだけで、最初のクエリで大量のデータが返されます。

たとえば、学生にクエリを実行する場合、登録を熱心にロードします。 学生とその登録は、単一のクエリで取得されます。

次の例を見てみましょう。ここでは、それぞれの在籍者を持つすべての学生が、イーガーロードを使用してデータベースから取得されます。

class Program {

   static void Main(string[] args) {

      using (var context = new UniContextEntities()) {
        //Load all students and related enrollments
         var students = context.Students
            .Include(s ⇒ s.Enrollments).ToList();

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

            foreach (var enrollment in student.Enrollments) {
               Console.WriteLine("Enrollment ID: {0}, Course ID: {1}",
                  enrollment.EnrollmentID, enrollment.CourseID);
            }
         }

         Console.ReadKey();
      }
   }
}

上記のコードをコンパイルして実行すると、次の出力が表示されます。

ID: 1, Name: Ali Alexander
       Enrollment ID: 1, Course ID: 1050
       Enrollment ID: 2, Course ID: 4022
       Enrollment ID: 3, Course ID: 4041
ID: 2, Name: Meredith Alonso
       Enrollment ID: 4, Course ID: 1045
       Enrollment ID: 5, Course ID: 3141
       Enrollment ID: 6, Course ID: 2021
ID: 3, Name: Arturo Anand
       Enrollment ID: 7, Course ID: 1050
ID: 4, Name: Gytis Barzdukas
       Enrollment ID: 8, Course ID: 1050
       Enrollment ID: 9, Course ID: 4022

以下は、使用できる他の形式の熱心な読み込みクエリです。

//Load one Student and its related enrollments

var student1 = context.Students
   .Where(s ⇒ s.FirstMidName == "Ali")
   .Include(s ⇒ s.Enrollments).FirstOrDefault();

//Load all Students and related enrollments
//using a string to specify the relationship

var studentList = context.Students
   .Include("Enrollments").ToList();

//Load one Student and its related enrollments
//using a string to specify the relationship

var student = context.Students
   .Where(s ⇒ s.FirstMidName == "Salman")
   .Include("Enrollments").FirstOrDefault();

複数のレベル

関連するエンティティの複数のレベルを積極的にロードすることもできます。 次のクエリは、Student、Enrollments、およびCourseの例を示しています。

//Load all Students, all related enrollments, and all related courses

var studentList = context.Students
   .Include(s ⇒ s.Enrollments.Select(c ⇒ c.Course)).ToList();

//Load all Students, all related enrollments, and all related courses
//using a string to specify the relationships

var students = context.Students
   .Include("Enrollments.Course").ToList();

理解を深めるために、上記の例を段階的に実行することをお勧めします。