【问题标题】:Entity Framework - Load only Selected properties实体框架 - 仅加载选定的属性
【发布时间】:2019-07-26 20:55:07
【问题描述】:

我没有亲身体验过它,因此不知道这个问题的相关性。

假设我有名为 Student 的表(StudentId、Name、Username、Address、DOB、DeptId、NavigationProp1Id....)和 Department 表(Deptd、DeptName.、NavigationProPid)。因此,如果表结构如下所示,当我使用“contex.Studnets”时,我可以获得包括导航属性在内的所有属性,如果表 2 具有其他导航属性,也可以加载它。我对么?

如果是这样,是否会导致任何性能问题?我可以仅从实体加载选定的属性,例如仅从学生实体加载用户名、地址吗?

【问题讨论】:

    标签: asp.net entity-framework-4


    【解决方案1】:

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

    您只能加载选定的属性 - 这称为投影。限制是您不能加载具有属性子集的学生实体。您需要新类或匿名类型:

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

    【讨论】:

      【解决方案2】:

      使用实体框架 (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() 可能会返回整个数据库的位置!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-11
        • 1970-01-01
        • 2015-12-13
        • 2022-01-16
        • 1970-01-01
        相关资源
        最近更新 更多