2013-10-28 17 views
2

我有一名員工。 員工有一個(父母)部門。 1:N,部門與員工。 員工有N個EmployeeToJobTitleMatchLink(s)。
員工有N個ParkingArea(s)。NHibernate Linq //帶子對象的FirstOrDefault //可能嗎?

當使用NHibernate和LINQ和 「FirstOrDefault」 ..

  EmployeeNHEntity firstOrDefaultEmp = session.Query<EmployeeNHEntity>() 
       .Fetch(e => e.MyEmployeeToJobTitleMatchLinks) 
       .Fetch(e => e.ParentDepartment) 
       .Fetch(e => e.MyParkingAreas) 
       .Where(e => e.EmployeeUUID == employeeUuid) 
       .FirstOrDefault(); 

我得到這個SQL。 (最重要的部分是「頂部1」。

exec sp_executesql N'select TOP (1) employeenh0_.EmployeeUUID as Employee1_1_0_, myemployee1_.LinkSurrogateUUID as LinkSurr1_3_1_, department2_.DepartmentUUID as Departme1_0_2_, parkingare4_.ParkingAreaUUID as ParkingA1_5_3_, employeenh0_.MyVersionColumn as MyVersio2_1_0_, employeenh0_.SSN as SSN1_0_, employeenh0_.LastName as LastName1_0_, employeenh0_.FirstName as FirstName1_0_, employeenh0_.CreateDate as CreateDate1_0_, employeenh0_.HireDate as HireDate1_0_, employeenh0_.ParentDepartmentUUID as ParentDe8_1_0_, myemployee1_.PriorityRank as Priority2_3_1_, myemployee1_.JobStartedOnDate as JobStart3_3_1_, myemployee1_.TheEmployeeUUID as TheEmplo4_3_1_, myemployee1_.TheJobTitleUUID as TheJobTi5_3_1_, myemployee1_.TheEmployeeUUID as TheEmplo4_0__, myemployee1_.LinkSurrogateUUID as LinkSurr1_0__, department2_.MyVersionColumn as MyVersio2_0_2_, department2_.DepartmentName as Departme3_0_2_, department2_.CreateDate as CreateDate0_2_, parkingare4_.ParkingAreaName as ParkingA2_5_3_, parkingare4_.CreateDate as CreateDate5_3_, myparkinga3_.AbcEmployeeUUID as AbcEmplo1_1__, myparkinga3_.AbcParkingAreaUUID as AbcParki2_1__ from dbo.Employee employeenh0_ left outer join dbo.EmployeeToJobTitleMatchLink myemployee1_ on employeenh0_.EmployeeUUID=myemployee1_.TheEmployeeUUID left outer join dbo.Department department2_ on employeenh0_.ParentDepartmentUUID=department2_.DepartmentUUID left outer join EmployeeToParkingAreaLink myparkinga3_ on employeenh0_.EmployeeUUID=myparkinga3_.AbcEmployeeUUID left outer join dbo.ParkingArea parkingare4_ on myparkinga3_.AbcParkingAreaUUID=parkingare4_.ParkingAreaUUID where [email protected]',N'@p0 uniqueidentifier',@p0='64409648-15C5-4B67-BCE2-A265012E0926' 

的問題是,我得到1行(前1)。雖然我有1名員工,我做一下在結果多行。

現在,如果我使用下面的內容,我會得到期望的結果(單個僱員與子對象填充)....如果在代理鍵(EmployeeUUID)匹配,有一個項目在集合。

  IList<EmployeeNHEntity> emps = session.Query<EmployeeNHEntity>() 
       .Fetch(e => e.MyEmployeeToJobTitleMatchLinks) 
       .Fetch(e => e.ParentDepartment) 
       .Fetch(e => e.MyParkingAreas) 
       .Where(e => e.EmployeeUUID == employeeUuid) 
       .ToList(); 

      EmployeeNHEntity emp = null; 
      if(null!=emps) 
      { 
       if (emps.Count > 0) 
       { 
        emp = emps[0]; 
       } 
      } 

生成此SQL

exec sp_executesql N'select employeenh0_.EmployeeUUID as Employee1_1_0_, myemployee1_.LinkSurrogateUUID as LinkSurr1_3_1_, department2_.DepartmentUUID as Departme1_0_2_, parkingare4_.ParkingAreaUUID as ParkingA1_5_3_, employeenh0_.MyVersionColumn as MyVersio2_1_0_, employeenh0_.SSN as SSN1_0_, employeenh0_.LastName as LastName1_0_, employeenh0_.FirstName as FirstName1_0_, employeenh0_.CreateDate as CreateDate1_0_, employeenh0_.HireDate as HireDate1_0_, employeenh0_.ParentDepartmentUUID as ParentDe8_1_0_, myemployee1_.PriorityRank as Priority2_3_1_, myemployee1_.JobStartedOnDate as JobStart3_3_1_, myemployee1_.TheEmployeeUUID as TheEmplo4_3_1_, myemployee1_.TheJobTitleUUID as TheJobTi5_3_1_, myemployee1_.TheEmployeeUUID as TheEmplo4_0__, myemployee1_.LinkSurrogateUUID as LinkSurr1_0__, department2_.MyVersionColumn as MyVersio2_0_2_, department2_.DepartmentName as Departme3_0_2_, department2_.CreateDate as CreateDate0_2_, parkingare4_.ParkingAreaName as ParkingA2_5_3_, parkingare4_.CreateDate as CreateDate5_3_, myparkinga3_.AbcEmployeeUUID as AbcEmplo1_1__, myparkinga3_.AbcParkingAreaUUID as AbcParki2_1__ from dbo.Employee employeenh0_ left outer join dbo.EmployeeToJobTitleMatchLink myemployee1_ on employeenh0_.EmployeeUUID=myemployee1_.TheEmployeeUUID left outer join dbo.Department department2_ on employeenh0_.ParentDepartmentUUID=department2_.DepartmentUUID left outer join EmployeeToParkingAreaLink myparkinga3_ on employeenh0_.EmployeeUUID=myparkinga3_.AbcEmployeeUUID left outer join dbo.ParkingArea parkingare4_ on myparkinga3_.AbcParkingAreaUUID=parkingare4_.ParkingAreaUUID where [email protected]',N'@p0 uniqueidentifier',@p0='64409648-15C5-4B67-BCE2-A265012E0926' 

[0]索引器技巧沒問題。但只是沒有我想要的Linq代碼那麼幹淨。

任何建議現在LINQ語法獲得前1名員工,但與所有的兒童對象?

回答

3
EmployeeNHEntity firstOrDefaultEmp = session.Query<EmployeeNHEntity>() 
    .Fetch(e => e.MyEmployeeToJobTitleMatchLinks) 
    .Fetch(e => e.ParentDepartment) 
    .Fetch(e => e.MyParkingAreas) 
    .Where(e => e.EmployeeUUID == employeeUuid) 
    .AsEnumerable() <-- note this line 
    .FirstOrDefault(); 
+0

爲什麼shloud他使用'AsEnumerable'方法? –

+0

我不知道爲什麼這樣的作品,但它的作品。什麼是伏都教? – granadaCoder

+0

我閱讀了文檔。我沒有看到任何提示。 http://msdn.microsoft.com/en-us/library/bb340482.aspx – granadaCoder

相關問題