2016-01-20 76 views
0

我遇到一些問題正在使用EF中的方法組加載相關實體實體框架方法組包含不起作用

在簡單查詢中加載相關實體Include配合使用。

例如:

var result = 
    Repository.Query<TimeState>(x => x.Accepted == 0 && x.ProjectID != null && myTeam.Contains(x.EmployeeID)) 
         .Include(typeof(Project).Name) 
         .Include(typeof(Employee).Name) 
         .Include(typeof(EmployeeDetails).Name) 
         .OrderByDescending(x => x.SubmitedDate); 

運行完美,並加載項目和員工

但在接下來的查詢不加載的項目及僱員

var result2 = from item in Repository.Query<TimeState>(x => x.Accepted == 0 && x.ProjectID != null) 
               .Include(typeof(Project).Name) 
               .Include(typeof(Employee).Name) 
               .Include(typeof(EmployeeDetails).Name) 
       let projectId = (int)item.ProjectID 
       let isA = projectsIds.Contains(projectId) && item.Employee.EmployeeDetails.SuperiorID == id 
       let isB = item.Project.ManagerID == id && employeesTeam.Contains(item.EmployeeID) 
       where isA || isB 
       orderby item.SubmitedDate descending 
       select item; 

我試着做這樣的改變:select new { item, item.Employee, item.Project };

var result3 = from item in Repository.Query<TimeState>(x => x.Accepted == 0 && x.ProjectID != null) 
               .Include(typeof(Project).Name) 
               .Include(typeof(Employee).Name) 
               .Include(typeof(EmployeeDetails).Name) 
       let projectId = (int)item.ProjectID 
       let isA = projectsIds.Contains(projectId) && item.Employee.EmployeeDetails.SuperiorID == id 
       let isB = item.Project.ManagerID == id && employeesTeam.Contains(item.EmployeeID) 
       where isA || isB 
       orderby item.SubmitedDate descending 
       select new { item, item.Employee, item.Project }; 

之後,result3[0].Employee的值爲result3[0].Project(或該集合中的任何其他項)的值相同。
問題是我不需要員工和項目作爲這個動態對象的獨立屬性result3

如何在返回result2的方法中擁有Employee和Project? :)

+0

從'result2'訪問'Project'或'Employee'時會發生什麼? – Default

+0

順便問一下,你爲什麼回滾marc_s的編輯? IMO編輯提高了我們問題的可讀性。 – Default

+0

@Default,在'result2'中'Employee'和'Project'是NULL。 – meorfi

回答

2

我很少使用查詢語法,我從來沒有使用.INCLUDE碰上有人(typeof運算(..)名稱)語法嘗試以下方法:

var result2 = (from item in Repository.Query<TimeState>(x => x.Accepted == 0 && x.ProjectID != null) 
       let projectId = (int)item.ProjectID 
       let isA = projectsIds.Contains(projectId) && item.Employee.EmployeeDetails.SuperiorID == id 
       let isB = item.Project.ManagerID == id && employeesTeam.Contains(item.EmployeeID) 
       where isA || isB 
       orderby item.SubmitedDate descending 
       select item) 
    .Include(i=>i.Projects) 
    .Include(i=>i.Employees) 
    .Include(i=>i.EmployeeDetails); 

您可能需要包括using System.Data.Entity;以及這工作。

+0

感謝您的建議。 :)它的工作原理(我已經在'* .cs'文件頭中使用了System.Data.Entity;' – meorfi

+0

),你更喜歡哪種查詢語法? (可能它會是一個更好的選擇:)) – meorfi

+1

我通常使用方法/ lambda語法。 –