Continuation to the previous question,我试图以另一种方式避免这个问题:
仅提醒:
我的数据库架构如下所述:
表格< - >登录
< --->> 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:Object 引用未设置为的实例 对象
编辑: stacktrace:
在 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)at Remotion.Data.Linq.QueryModelVisitorBase.VisitQueryModel(QueryModel queryModel)at 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(字符串 queryIdentifier,IQueryExpression queryExpression,String collectionRole,布尔浅, IDictionary2 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工厂) d:\ CSHARP \ NH \的nhibernate \ SRC \ NHibernate的\引擎\查询\ HQLExpressionQueryPlan.cs:线 34点 NHibernate.Engine.Query.HQLExpressionQueryPlan..ctor(字符串 expressionStr,IQueryExpression queryExpression,String collectionRole,布尔浅, IDictionary2 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工厂) d:\ CSHARP \ NH \的nhibernate \ SRC \ NHibernate的\引擎\查询\ 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.List1..ctor(IEnumerable
1 收藏) System.Linq.Enumerable.ToList [TSource](IEnumerable`1 来源) TestUsingDevelopmentDataBase.Moch.BillOfSale.Data.FormRepositoryTests.Can_Get_Forms_Where_CorporationNumber_Is_510778087_Metohd1() 在 d:\开发\ 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);
}
但当然我们都更喜欢优雅的方式,并希望了解问题背后的原因
答案 0 :(得分:0)
我认为Nhibernate不喜欢你在选择后获取。我像你一样遇到了一个空引用异常。
请在此处查看我的问题。
In Linq-to-Nhibernate, is it possible to use .Fetch() after a .Select()?
你可能能够在你的第二个例子中提取之后选择(x => x.Form).ToList()它。
我正在使用Nhibernate 3.2,这仍然是一个问题。应该有一个适当的'你不能在选择'异常后获取或什么东西,以免我们一些痛苦。