我没有亲身体验EF,因此不知道问题的相关性。 假设我有名为Student(StudentId,Name,Username,Address,DOB,DeptId,NavigationProp1Id ....)和Depatement表(Deptd,DeptName。,NavigationProPid)的表。因此,如果像这样的表结构,当我使用'contex.Studnets'时,我可以获得所有prpoerties及其包括导航属性,如果表2具有其他导航属性,它也可以加载。我对么 ?
如果是,是否会导致任何性能问题?我是否可以仅加载来自实体的选定属性,例如仅来自Studnet enity的UserName,Addres?
非常感谢任何帮助
Thnx和问候
骨多
答案 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()可能返回整个数据库的位置非常有帮助!