2011-11-10 41 views
4

我沒有經驗的EF手,因此不知道問題的相關性。 假設我有名爲Student(StudentId,Name,Username,Address,DOB,DeptId,NavigationProp1Id ....)和Depatement表(Deptd,DeptName。,NavigationProPid)中的表。所以如果一個表格結構如下所示,當我使用'contex.Studnets'時,我可以得到所有的prpoerties,包括導航屬性,如果表2具有其他導航屬性,它也可以加載。我對麼 ?實體框架 - 只加載選定的屬性

如果是這樣,是否會導致任何性能問題?我是否可以只加載Entity中的選定屬性,如僅來自Studnet enity的UserName,Addres?

任何幫助,將不勝感激

日Thnx和問候

骨多

回答

16

沒有導航屬性,不立即裝載。如果你使用Include方法,或者當你第一次訪問它們(這也是你在調試器中看到它們的原因=通過調試器導致延遲加載)時,它們會被明確加載。

您只能加載選定的屬性 - 它被稱爲投影。限制是您無法使用屬性子集加載Student實體。您需要用新的類或匿名類型:

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

當使用實體框架(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()可能會返回整個數據庫非常有幫助!