LoadWith<T> - Eager Loading
Posted: Wed 22 Jun 2011 19:25
I'm using the LoadWith DataLoadOption to eager load several child entities of my parent object. I have a parent object named Bank. It contains zero to many relationships for Category, BankText, and BankLimit. I would expect the eager loading feature to return a single Bank with it's child entities (collections) populated. Instead, I'm receiving a numerours rows per bank. Isn't the intent of the ORM to roll those rows up into the parent object? How can I make that happen?
Visual Studio 2010
dotConnect for Oracle v6.30.172
LinqConnect v 2.50.25
Given the code below:
The query generated looks like:
SELECT t1.NAME, t1.AWARDTYPE, t1.BANKKEY, t1.COMPANYKEY, t1.PERIODKEY, t1.FAMILYTYPE, t1.ISDISPLAYED, t1.ISNOVALUE, t1.CHECKDATE, t1.LOCKEDBY, t1.CREATEDBY, t1.CREATEDDATE, t1.UPDATEDBY, t1.UPDATEDDATE, t1.COMPLETEDATETYPE, t4.BANKKEY AS BANKKEY1, t4.DEFAULTTEXTKEY, t4.CONTENT, t4.CREATEDBY AS CREATEDBY1, t4.CREATEDDATE AS CREATEDDATE1, t4.UPDATEDBY AS UPDATEDBY1, t4.UPDATEDDATE AS UPDATEDDATE1, t3.CATEGORYKEY, t3.BANKKEY AS BANKKEY2, t3.MINAWARD, t3.MAXAWARD, t3.ISREQUIRED, t3.ISNOVALUE AS ISNOVALUE1, t3.SEQUENCE, t3.CREATEDBY AS CREATEDBY2, t3.CREATEDDATE AS CREATEDDATE2, t3.UPDATEDBY AS UPDATEDBY2, t3.UPDATEDDATE AS UPDATEDDATE2, t3.ISACTIVE, t5.BANKKEY AS BANKKEY3, t5.FAMILYSTATUS, t5.MINAWARD AS MINAWARD1, t5.MAXAWARD AS MAXAWARD1, t5.ISMINSHOWN, t5.ISTRACKERSHOWN, t5.CREATEDBY AS CREATEDBY3, t5.CREATEDDATE AS CREATEDDATE3, t5.UPDATEDBY AS UPDATEDBY3, t5.UPDATEDDATE AS UPDATEDDATE3
FROM (
SELECT t2.NAME, t2.AWARDTYPE, t2.BANKKEY, t2.COMPANYKEY, t2.PERIODKEY, t2.FAMILYTYPE, t2.ISDISPLAYED, t2.ISNOVALUE, t2.CHECKDATE, t2.LOCKEDBY, t2.CREATEDBY, t2.CREATEDDATE, t2.UPDATEDBY, t2.UPDATEDDATE, t2.COMPLETEDATETYPE
FROM INCENTIVE.BANK t2
WHERE t2.BANKKEY = 143
) t1
LEFT OUTER JOIN INCENTIVE.CATEGORY t3 ON t1.BANKKEY = t3.BANKKEY
LEFT OUTER JOIN INCENTIVE.BANKTEXT t4 ON t1.BANKKEY = t4.BANKKEY
LEFT OUTER JOIN INCENTIVE.BANKLIMIT t5 ON t1.BANKKEY = t5.BANKKEY
ORDER BY t1.BANKKEY, t1.BANKKEY, t1.BANKKEY
Error Message:
"Sequence contains more then one element"
The stack trace reads like this:
Devart.Data.Linq.Provider.DataProvider.ReadQuery(CompiledQuery compiledQuery, IDbConnection con, k dataReader)\r\n at Devart.Data.Linq.Provider.DataProvider.ExecuteQuery(CompiledQuery compiledQuery, Object[] parentArgs, Object[] userArgs, Object lastResult)\r\n at Devart.Data.Linq.Provider.DataProvider.ExecuteAllQueries(CompiledQuery compiledQuery, Object[] userArguments)\r\n at Devart.Data.Linq.Provider.DataProvider.Devart.Data.Linq.Provider.IProvider.Execute(Expression query)\r\n at Devart.Data.Linq.DataQuery`1.System.Linq.IQueryProvider.Execute[S](Expression expression)\r\n at System.Linq.Queryable.FirstOrDefault[TSource](IQueryable`1 source)\r\n at Staywell.Incentives.Repository.BankRepository.c__DisplayClass1.b__0() in C:\src10\Staywell\Main\Staywell.Incentives\Repository\Repository\BankRepository.cs:line 56\r\n at Staywell.Incentives.Repository.ExceptionManager.Call[T](Func`1 function, IExceptionStrategy strategy) in C:\src10\Staywell\Main\Staywell.Incentives\Repository\Repository\Exceptions\ExceptionManager.cs:line 53"
Visual Studio 2010
dotConnect for Oracle v6.30.172
LinqConnect v 2.50.25
Given the code below:
Code: Select all
DataLoadOptions dataLoadOptions = new DataLoadOptions();
dataLoadOptions.LoadWith(b => b.Categories, FetchMode.Join);
dataLoadOptions.LoadWith(b => b.BankTexts, FetchMode.Join);
dataLoadOptions.LoadWith(b => b.BankLimits, FetchMode.Join);
db.LoadOptions = dataLoadOptions;
db.DeferredLoadingEnabled = false;
return (from b in db.Banks where b.Bankkey == bankKey select b).FirstOrDefault();
SELECT t1.NAME, t1.AWARDTYPE, t1.BANKKEY, t1.COMPANYKEY, t1.PERIODKEY, t1.FAMILYTYPE, t1.ISDISPLAYED, t1.ISNOVALUE, t1.CHECKDATE, t1.LOCKEDBY, t1.CREATEDBY, t1.CREATEDDATE, t1.UPDATEDBY, t1.UPDATEDDATE, t1.COMPLETEDATETYPE, t4.BANKKEY AS BANKKEY1, t4.DEFAULTTEXTKEY, t4.CONTENT, t4.CREATEDBY AS CREATEDBY1, t4.CREATEDDATE AS CREATEDDATE1, t4.UPDATEDBY AS UPDATEDBY1, t4.UPDATEDDATE AS UPDATEDDATE1, t3.CATEGORYKEY, t3.BANKKEY AS BANKKEY2, t3.MINAWARD, t3.MAXAWARD, t3.ISREQUIRED, t3.ISNOVALUE AS ISNOVALUE1, t3.SEQUENCE, t3.CREATEDBY AS CREATEDBY2, t3.CREATEDDATE AS CREATEDDATE2, t3.UPDATEDBY AS UPDATEDBY2, t3.UPDATEDDATE AS UPDATEDDATE2, t3.ISACTIVE, t5.BANKKEY AS BANKKEY3, t5.FAMILYSTATUS, t5.MINAWARD AS MINAWARD1, t5.MAXAWARD AS MAXAWARD1, t5.ISMINSHOWN, t5.ISTRACKERSHOWN, t5.CREATEDBY AS CREATEDBY3, t5.CREATEDDATE AS CREATEDDATE3, t5.UPDATEDBY AS UPDATEDBY3, t5.UPDATEDDATE AS UPDATEDDATE3
FROM (
SELECT t2.NAME, t2.AWARDTYPE, t2.BANKKEY, t2.COMPANYKEY, t2.PERIODKEY, t2.FAMILYTYPE, t2.ISDISPLAYED, t2.ISNOVALUE, t2.CHECKDATE, t2.LOCKEDBY, t2.CREATEDBY, t2.CREATEDDATE, t2.UPDATEDBY, t2.UPDATEDDATE, t2.COMPLETEDATETYPE
FROM INCENTIVE.BANK t2
WHERE t2.BANKKEY = 143
) t1
LEFT OUTER JOIN INCENTIVE.CATEGORY t3 ON t1.BANKKEY = t3.BANKKEY
LEFT OUTER JOIN INCENTIVE.BANKTEXT t4 ON t1.BANKKEY = t4.BANKKEY
LEFT OUTER JOIN INCENTIVE.BANKLIMIT t5 ON t1.BANKKEY = t5.BANKKEY
ORDER BY t1.BANKKEY, t1.BANKKEY, t1.BANKKEY
Error Message:
"Sequence contains more then one element"
The stack trace reads like this:
Devart.Data.Linq.Provider.DataProvider.ReadQuery(CompiledQuery compiledQuery, IDbConnection con, k dataReader)\r\n at Devart.Data.Linq.Provider.DataProvider.ExecuteQuery(CompiledQuery compiledQuery, Object[] parentArgs, Object[] userArgs, Object lastResult)\r\n at Devart.Data.Linq.Provider.DataProvider.ExecuteAllQueries(CompiledQuery compiledQuery, Object[] userArguments)\r\n at Devart.Data.Linq.Provider.DataProvider.Devart.Data.Linq.Provider.IProvider.Execute(Expression query)\r\n at Devart.Data.Linq.DataQuery`1.System.Linq.IQueryProvider.Execute[S](Expression expression)\r\n at System.Linq.Queryable.FirstOrDefault[TSource](IQueryable`1 source)\r\n at Staywell.Incentives.Repository.BankRepository.c__DisplayClass1.b__0() in C:\src10\Staywell\Main\Staywell.Incentives\Repository\Repository\BankRepository.cs:line 56\r\n at Staywell.Incentives.Repository.ExceptionManager.Call[T](Func`1 function, IExceptionStrategy strategy) in C:\src10\Staywell\Main\Staywell.Incentives\Repository\Repository\Exceptions\ExceptionManager.cs:line 53"