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();
NHibernate Linq // FirstOrDefault with children objects // Possible?
-
01-07-2022 - |
Question
I have an Employee.
Employee has a single (parent) Department. 1:N, Department to Employee.
Employee has N EmployeeToJobTitleMatchLink(s).
Employee has N number of ParkingArea(s).
When using NHibernate and Linq, and "FirstOrDefault"..
EmployeeNHEntity firstOrDefaultEmp = session.Query<EmployeeNHEntity>()
.Fetch(e => e.MyEmployeeToJobTitleMatchLinks)
.Fetch(e => e.ParentDepartment)
.Fetch(e => e.MyParkingAreas)
.Where(e => e.EmployeeUUID == employeeUuid)
.FirstOrDefault();
I get this sql. (the most important part is the "Top 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 employeenh0_.EmployeeUUID=@p0',N'@p0 uniqueidentifier',@p0='64409648-15C5-4B67-BCE2-A265012E0926'
The issue is that I get 1 row (top 1). While I have 1 Employee, I (should) have many rows in the resultset.
Now, if I use the below, I get the desired result. (A single employee with the children objects populated)....if there is a match on the surrogate-key (EmployeeUUID), there is one item in the collection.
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];
}
}
which generates this 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 employeenh0_.EmployeeUUID=@p0',N'@p0 uniqueidentifier',@p0='64409648-15C5-4B67-BCE2-A265012E0926'
The [0] indexer trick is ok. But just isn't as clean as I'd like my Linq code to be.
Any suggestions now LINQ syntax to get Top 1 Employee, but with all the children objects?
Solution