猿教程 Logo

Entity Framework预先加载

预先加载是一种对一种类型的实体的查询也加载相关实体作为查询的一部分的过程。 使用Include()方法实现预先加载。

在下面的示例中,它使用Include()方法从数据库中获取所有学生及其标准。

LINQ查询语法案例:

        using (var context = new SchoolDBEntities())
        {
            var res = (from s in context.Students.Include("Standard")
                        where s.StudentName == "Student1"
                        select s).FirstOrDefault<Student>();
        }

LINQ方法语法案例:

    using (var ctx = new SchoolDBEntities())
        {
            stud = ctx.Students.Include("Standard")
                               .Where(s => s.StudentName == "Student1").FirstOrDefault<Student>();
           
        }

上面显示的代码将执行以下SQL查询:

SELECT TOP (1) 
[Extent1].[StudentID] AS [StudentID], 
[Extent1].[StudentName] AS [StudentName], 
[Extent2].[StandardId] AS [StandardId], 
[Extent2].[StandardName] AS [StandardName], 
[Extent2].[Description] AS [Description]
FROM  [dbo].[Student] AS [Extent1]
LEFT OUTER JOIN [dbo].[Standard] AS [Extent2] ON [Extent1].[StandardId] = [Extent2].[StandardId]
WHERE 'Student1' = [Extent1].[StudentName]

使用Lambda表达式:

您还可以在Include方法中使用linq lambda表达式。 为此,需要添加System.Data.Entity命名空间的引用并使用lambda表达式,如下所示。

using System;
using System.Data.Entity; 
   
class Program
{
    static void Main(string[] args)
    {
    
        using (var ctx = new SchoolDBEntities())
        {
            stud = ctx.Students.Include(s => s.Standard)
                                .Where(s => s.StudentName == "Student1")
                                .FirstOrDefault<Student>();
           
        }
    }
}

上面显示的代码将执行以下SQL查询:

SELECT TOP (1) 
[Extent1].[StudentID] AS [StudentID], 
[Extent1].[StudentName] AS [StudentName], 
[Extent2].[StandardId] AS [StandardId], 
[Extent2].[StandardName] AS [StandardName], 
[Extent2].[Description] AS [Description]
FROM  [dbo].[Student] AS [Extent1]
LEFT OUTER JOIN [dbo].[Standard] AS [Extent2] ON [Extent1].[StandardId] = [Extent2].[StandardId]
WHERE 'Student1' = [Extent1].[StudentName]

加载多个级别的相关实体:

您还可以预先加载多个级别的相关实体。 下面显示的代码段加载了相关的学生,标准和教师:

using (var ctx = new SchoolDBEntities())
    {
        stud = ctx.Students.Include("Standard.Teachers")
                            .Where(s => s.StudentName == "Student1")
                            .FirstOrDefault<Student>();
    }

或者使用lambda表达式如下。

using (var ctx = new SchoolDBEntities())
    {
        stud = ctx.Students.Include(s => s.Standard.Teachers)
                            .Where(s => s.StudentName == "Student1")
                            .FirstOrDefault<Student>();
    }

上面显示的代码将执行以下SQL查询:

SELECT [Project2].[StudentID] AS [StudentID], 
[Project2].[StudentName] AS [StudentName], 
[Project2].[StandardId] AS [StandardId], 
[Project2].[StandardName] AS [StandardName], 
[Project2].[Description] AS [Description], 
[Project2].[C1] AS [C1], 
[Project2].[TeacherId] AS [TeacherId], 
[Project2].[TeacherName] AS [TeacherName], 
[Project2].[StandardId1] AS [StandardId1]
FROM ( SELECT 
    [Limit1].[StudentID] AS [StudentID], 
    [Limit1].[StudentName] AS [StudentName], 
    [Limit1].[StandardId1] AS [StandardId], 
    [Limit1].[StandardName] AS [StandardName], 
    [Limit1].[Description] AS [Description], 
    [Project1].[TeacherId] AS [TeacherId], 
    [Project1].[TeacherName] AS [TeacherName], 
    [Project1].[StandardId] AS [StandardId1], 
    CASE WHEN ([Project1].[TeacherId] IS NULL) THEN CAST(NULL AS int) ELSE 1 END AS [C1]
    FROM   (SELECT TOP (1) [Extent1].[StudentID] AS [StudentID], [Extent1].[StudentName] AS [StudentName], [Extent1].[StandardId] AS [StandardId2], [Extent2].[StandardId] AS [StandardId1], [Extent2].[StandardName] AS [StandardName], [Extent2].[Description] AS [Description]
        FROM  [dbo].[Student] AS [Extent1]
        LEFT OUTER JOIN [dbo].[Standard] AS [Extent2] ON [Extent1].[StandardId] = [Extent2].[StandardId]
        WHERE 'updated student' = [Extent1].[StudentName] ) AS [Limit1]
    LEFT OUTER JOIN  (SELECT 
        [Extent3].[TeacherId] AS [TeacherId], 
        [Extent3].[TeacherName] AS [TeacherName], 
        [Extent3].[StandardId] AS [StandardId]
        FROM [dbo].[Teacher] AS [Extent3]
        WHERE [Extent3].[StandardId] IS NOT NULL ) AS [Project1] ON [Limit1].[StandardId2] = [Project1].[StandardId]
)  AS [Project2]
ORDER BY [Project2].[StudentID] ASC, [Project2].[StandardId] ASC, [Project2].[C1] ASC

猿教程(www.yuanjiaocheng.net)下一节将了解Entity Framework如何支持实体的延迟加载。


版权声明:本站所有教程均为本站原创或翻译,转载请注明出处,请尊重他人劳动果实。请记住本站地址:www.yuanjiaocheng.net (猿教程) 作者:卿文刚
本文标题: C#环境
本文地址:http://www.yuanjiaocheng.net/entity/eager-loading-with-dbcontext.html