实体框架 - 仅加载选定的属性

时间:2011-11-10 07:36:58

标签: asp.net entity-framework-4

我没有亲身体验EF,因此不知道问题的相关性。 假设我有名为Student(StudentId,Name,Username,Address,DOB,DeptId,NavigationProp1Id ....)和Depatement表(Deptd,DeptName。,NavigationProPid)的表。因此,如果像这样的表结构,当我使用'contex.Studnets'时,我可以获得所有prpoerties及其包括导航属性,如果表2具有其他导航属性,它也可以加载。我对么 ?

如果是,是否会导致任何性能问题?我是否可以仅加载来自实体的选定属性,例如仅来自Studnet enity的UserName,Addres?

非常感谢任何帮助

Thnx和问候

骨多

2 个答案:

答案 0 :(得分:18)

未立即加载任何导航属性。如果你使用Include方法,或者第一次访问它们时,它们会被显式加载(这也是你在调试器中看到它们=通过调试器访问导致延迟加载的原因)。

您只能加载选定的属性 - 称为投影。限制是您无法使用属性子集加载Student实体。您需要新类或匿名类型:

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

答案 1 :(得分:1)

使用实体框架(EF)时,最佳解决方案是使用LINQ(http://msdn.microsoft.com/en-us/library/bb308959.aspx)查询EF上下文。 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()可能返回整个数据库的位置非常有帮助!