Продолжение предыдущего вопроса , я попытался избежать проблемы другим способом:
Только для напоминания:
Моя схема базы данных описана ниже:
Форма <-> Журнал
<--- >> Seller1
<--- >> Seller2
<--- >> Seller3
У меня есть крупный субъект (форма), один
одно отношение к другому объекту
(Журнал) И отношение один ко многим
Чайлдс (Продавцы).
Я хочу вытащить все формы, которые
один из их продавцов встречает наверняка
условия.
Я попробовал вот так сейчас:
[Test]
public void Can_Get_Forms_Where_CorporationNumber_Is_510778087_Metohd1()
{
var CorporationNumber = "513514950";
var list1 = sellerRepository
.Where(x => x.CorporationNumber == CorporationNumber)
.Select(x => x.Form)
.Fetch(x => x.Log)
.Take(10).ToList();
CollectionAssert.IsNotEmpty(list1);
}
Но, к сожалению, я получаю исключение NullReferenceException:
TestUsingDevelopmentDataBase.Moch.BillOfSale.Data.FormRepositoryTests.Can_Get_Forms_Where_CorporationNumber_Is_510778087_Metohd1:
System.NullReferenceException: объект
ссылка не установлена на экземпляр
объект
РЕДАКТИРОВАТЬ: трассировки стека:
в
NHibernate.Linq.Visitors.ResultOperatorProcessors.ProcessFetch.Process (FetchRequestBase
resultOperator, QueryModelVisitor
queryModelVisitor, IntermediateHqlTree
дерево) в
d: \ CSharp \ NH \ NHibernate \ SRC \ NHibernate \ Linq \ Посетители \ ResultOperatorProcessors \ ProcessFetch.cs: линия
11 в
NHibernate.Linq.Visitors.ResultOperatorProcessors.ProcessFetchOne.Process (FetchOneRequest
resultOperator, QueryModelVisitor
queryModelVisitor, IntermediateHqlTree
дерево) в
d: \ CSharp \ NH \ NHibernate \ SRC \ NHibernate \ Linq \ Посетители \ ResultOperatorProcessors \ ProcessFetchOne.cs: линия
9 в
NHibernate.Linq.Visitors.ResultOperatorProcessors.ResultOperatorProcessor 1.Process(ResultOperatorBase
resultOperator, QueryModelVisitor
queryModel, IntermediateHqlTree tree)
in
d:\CSharp\NH\nhibernate\src\NHibernate\Linq\Visitors\ResultOperatorProcessors\ResultOperatorProcessor.cs:line
17 at
NHibernate.Linq.Visitors.ResultOperatorProcessors.ResultOperatorMap.Process(ResultOperatorBase
resultOperator, QueryModelVisitor
queryModel, IntermediateHqlTree tree)
in
d:\CSharp\NH\nhibernate\src\NHibernate\Linq\Visitors\ResultOperatorProcessors\ResultOperatorMap.cs:line
24 at
NHibernate.Linq.Visitors.QueryModelVisitor.VisitResultOperator(ResultOperatorBase
resultOperator, QueryModel queryModel,
Int32 index) in
d:\CSharp\NH\nhibernate\src\NHibernate\Linq\Visitors\QueryModelVisitor.cs:line
125 at
Remotion.Data.Linq.Clauses.ResultOperatorBase.Accept(IQueryModelVisitor
visitor, QueryModel queryModel, Int32
index) at
Remotion.Data.Linq.QueryModelVisitorBase.VisitResultOperators(ObservableCollection
1
resultOperators, QueryModel
queryModel) в
Remotion.Data.Linq.QueryModelVisitorBase.VisitQueryModel (QueryModel
queryModel) в
NHibernate.Linq.Visitors.QueryModelVisitor.Visit ()
в
d: \ CSharp \ NH \ NHibernate \ SRC \ NHibernate \ Linq \ Посетители \ QueryModelVisitor.cs: линия
96 в
NHibernate.Linq.Visitors.QueryModelVisitor.GenerateHqlQuery (QueryModel
queryModel, VisitorParameters
параметры, логический корень) в
d: \ CSharp \ NH \ NHibernate \ SRC \ NHibernate \ Linq \ Посетители \ QueryModelVisitor.cs: линия
49 в
NHibernate.Linq.NhLinqExpression.Translate (ISessionFactoryImplementor
sessionFactory) в
D: \ CSharp \ NH \ NHibernate \ SRC \ NHibernate \ Linq \ NhLinqExpression.cs: линия
67 в
NHibernate.Hql.Ast.ANTLR.ASTQueryTranslatorFactory.CreateQueryTranslators (String
queryIdentifier, IQueryExpression
queryExpression, String
collectionRole, логическое отмелое,
IDictionary 2 filters,
ISessionFactoryImplementor factory) in
d:\CSharp\NH\nhibernate\src\NHibernate\Hql\Ast\ANTLR\ASTQueryTranslatorFactory.cs:line
27 at
NHibernate.Engine.Query.HQLExpressionQueryPlan.CreateTranslators(String
expressionStr, IQueryExpression
queryExpression, String
collectionRole, Boolean shallow,
IDictionary
2 enabledFilters,
ISessionFactoryImplementor factory) в
d: \ CSharp \ NH \ NHibernate \ SRC \ NHibernate \ Engine \ Query \ HQLExpressionQueryPlan.cs: строка
34 в
NHibernate.Engine.Query.HQLExpressionQueryPlan..ctor (String
expressionStr, IQueryExpression
queryExpression, String
collectionRole, логическое отмелое,
IDictionary 2 enabledFilters,
ISessionFactoryImplementor factory) in
d:\CSharp\NH\nhibernate\src\NHibernate\Engine\Query\HQLExpressionQueryPlan.cs:line
23 at
NHibernate.Engine.Query.HQLExpressionQueryPlan..ctor(String
expressionStr, IQueryExpression
queryExpression, Boolean shallow,
IDictionary
2 enabledFilters,
ISessionFactoryImplementor factory) в
d: \ CSharp \ NH \ NHibernate \ SRC \ NHibernate \ Engine \ Query \ HQLExpressionQueryPlan.cs: строка
17 в
NHibernate.Engine.Query.QueryPlanCache.GetHQLQueryPlan (IQueryExpression
queryExpression, логическое отмелое,
IDictionary 2 enabledFilters) in
d:\CSharp\NH\nhibernate\src\NHibernate\Engine\Query\QueryPlanCache.cs:line
88 at
NHibernate.Impl.AbstractSessionImpl.GetHQLQueryPlan(IQueryExpression
queryExpression, Boolean shallow) in
d:\CSharp\NH\nhibernate\src\NHibernate\Impl\AbstractSessionImpl.cs:line
302 at
NHibernate.Impl.AbstractSessionImpl.CreateQuery(IQueryExpression
queryExpression) in
d:\CSharp\NH\nhibernate\src\NHibernate\Impl\AbstractSessionImpl.cs:line
258 at
NHibernate.Linq.NhQueryProvider.PrepareQuery(Expression
expression, IQuery& query,
NhLinqExpression& nhQuery) in
d:\CSharp\NH\nhibernate\src\NHibernate\Linq\NhQueryProvider.cs:line
42 at
NHibernate.Linq.NhQueryProvider.Execute(Expression
expression) in
d:\CSharp\NH\nhibernate\src\NHibernate\Linq\NhQueryProvider.cs:line
25 at
NHibernate.Linq.NhQueryProvider.Execute[TResult](Expression
expression) in
d:\CSharp\NH\nhibernate\src\NHibernate\Linq\NhQueryProvider.cs:line
102 at
Remotion.Data.Linq.QueryableBase
1.GetEnumerator ()
в
System.Collections.Generic.List 1..ctor(IEnumerable
1
коллекция) в
System.Linq.Enumerable.ToList [TSource] (IEnumerable`1
источник) в
TestUsingDevelopmentDataBase.Moch.BillOfSale.Data.FormRepositoryTests.Can_Get_Forms_Where_CorporationNumber_Is_510778087_Metohd1 ()
в
D: \ Dev \ NCommon \ Moch.BillOfSale \ Moch.BillOfSale.NHibenate.Tests \ FormRepositoryTests.cs: линия
207
Проблема может быть обойдена в менее хорошо, следующим образом:
[Test]
public void Can_Get_Forms_Where_CorporationNumber_Is_510778087_Metohd2()
{
var CorporationNumber = "513514950";
var list2 = sellerRepository
.Where(x => x.CorporationNumber == CorporationNumber)
.Fetch(x => x.Form).ThenFetch(x => x.Log)
.Take(10).ToList().Select(x => x.Form);
CollectionAssert.IsNotEmpty(list2);
}
Но, конечно, мы все предпочитаем элегантный способ и хотим понять, что стоит за этой проблемой