Entity Framework - 仅加载选定属性

6

我对EF技术没有实际经验,不清楚这个问题的相关性。

假设我有两个表格,一个是学生(StudentId, Name, Username, Address, DOB, DeptId, NavigationProp1Id...),另一个是部门(DeptId, DeptName, NavigationProPid),如果表格结构遵循这样的模式,当我使用“context.Students”时,我可以获取所有属性,包括导航属性,而如果表2有其他导航属性,它也可以被加载。我说的对吗?

如果是这样,会产生任何性能问题吗?我是否可以仅从实体中加载所需的属性,例如只从学生实体中加载用户名和地址?

2个回答

21

导航属性不会立即被加载。如果您使用Include方法,它们将被显式地加载,否则当您第一次访问它们时会懒惰地加载(这也是为什么您在调试器中看到它们 = 通过调试器访问导致了延迟加载的原因)。

你可以只加载所选属性 - 这称为投射。限制是您不能使用子集加载Student实体。您需要使用新类或匿名类型:

var query = context.Students.Select(x => new 
                {
                   x.UserName,
                   x.Address 
                }); 

1

在使用实体框架(EF)时,最好的解决方案是使用LINQ查询EF上下文(http://msdn.microsoft.com/en-us/library/bb308959.aspx)。 LINQ可用于跨关系查询,因此在您的场景中,您的代码将如下所示:

var joinedlist = context.Student.Join(
                // The table we wish to join to the Student table
                context.Department,
                // Item on student table we want to join from
                studentItem => studentItem.DeptId,
                // Item on department table we want to join to
                departmentItem => departmentItem.Deptd, 
                // New object just holding the values we wish to retrieve from the joined tables
                (studentItem, departmentItem) => new {
                        StudentId = studentItem.StudentId, 
                        StudentUsername = studentItem.Username,
                        StudentAddress = studentItem.Address,
                        DepartmentName = departmentItem.DeptName, 
                        Navigation = StudentItem.NavigationProp1Id
                    }
            );

上面的代码将为您生成一个可查询的列表,但是您可以使用LINQ做更多的事情。例如,选择数据子集并过滤结果:
var singleItem = joinedlist
                // Filter our joined list
                .Where(item => item.StudentId.Equals(1))
                // Select only a subset of columns
                .Select(item => new {item.StudentUsername, item.StudentAddress})
                // Return only a single item
                .FirstOrDefault();

关于性能 - 我建议获取一个分析器,可以显示您的 EF LINQ 语句的 SQL 输出。这在理解惰性加载和一个错误的 .ToList() 可能返回整个数据库时非常有帮助!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接