我的目标是编写一个简单的SQL连接,如下所示:
SELECT Tbl1.Field1,Tbl2.Field1,Tbl2.Field2,Tbl2.Field3
FROM Table1 as Tbl1 LEFT JOIN Table2 as Tbl2
ON Tbl1.Field1 = Tbl2.Field1 and Tbl1.Field2 = Tbl2.Field2 and Tbl1.Field3 = Tbl2.Field3
进入LinqToNhibernate,但是当我尝试以这种方式编码时,我得到了一个强制转换异常:
return ExecuteLinqQuery(
() => ( from Tbl1 in SessionManager.CurrentSession.Query<Table1>()
join Tbl2 in SessionManager.CurrentSession.Query<Table2>()
on new
{
Column1 = Tbl1.Field1,
Column2 = Tbl1.Field2,
Column3 = Tbl1.Field3
}
equals new
{
Column1 = Tbl2.Field1,
Column2 = Tbl2.Field2,
Column3 = Tbl2.Field3
}
into Tbl1JoinedTbl2
from Tbl2 in Tbl1JoinedTbl2.DefaultIfEmpty()
select new MyObject
{
Tbl1.Field1,
Tbl2.Field1,
Tbl2.Field2,
Tbl2.Field3
}
).ToList(),
disposeTransaction);
有什么想法吗?
这是堆栈跟踪:
System.InvalidCastException was caught
HResult=-2147467262
Message=Impossibile eseguire il cast di oggetti di tipo 'Remotion.Linq.Clauses.JoinClause' sul tipo 'Remotion.Linq.Clauses.FromClauseBase'.
Source=NHibernate
StackTrace:
in NHibernate.Linq.GroupJoin.GroupJoinAggregateDetectionVisitor.VisitQuerySourceReferenceExpression(QuerySourceReferenceExpression expression)
in Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitExpression(Expression expression)
in NHibernate.Linq.Visitors.NhExpressionTreeVisitor.VisitExpression(Expression expression)
in Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitMemberExpression(MemberExpression expression)
in NHibernate.Linq.GroupJoin.GroupJoinAggregateDetectionVisitor.VisitMemberExpression(MemberExpression expression)
in Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitExpression(Expression expression)
in NHibernate.Linq.Visitors.NhExpressionTreeVisitor.VisitExpression(Expression expression)
in Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitMemberExpression(MemberExpression expression)
in NHibernate.Linq.GroupJoin.GroupJoinAggregateDetectionVisitor.VisitMemberExpression(MemberExpression expression)
in Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitExpression(Expression expression)
in NHibernate.Linq.Visitors.NhExpressionTreeVisitor.VisitExpression(Expression expression)
in Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitMethodCallExpression(MethodCallExpression expression)
in Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitExpression(Expression expression)
in NHibernate.Linq.Visitors.NhExpressionTreeVisitor.VisitExpression(Expression expression)
in Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitMethodCallExpression(MethodCallExpression expression)
in Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitExpression(Expression expression)
in NHibernate.Linq.Visitors.NhExpressionTreeVisitor.VisitExpression(Expression expression)
in Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitBinaryExpression(BinaryExpression expression)
in Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitExpression(Expression expression)
in NHibernate.Linq.Visitors.NhExpressionTreeVisitor.VisitExpression(Expression expression)
in Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitBinaryExpression(BinaryExpression expression)
in Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitExpression(Expression expression)
in NHibernate.Linq.Visitors.NhExpressionTreeVisitor.VisitExpression(Expression expression)
in Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitMemberAssignment(MemberAssignment memberAssigment)
in Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitMemberBinding(MemberBinding memberBinding)
in Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitList[T](ReadOnlyCollection`1 list, Func`2 visitMethod)
in Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitMemberBindingList(ReadOnlyCollection`1 expressions)
in Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitMemberInitExpression(MemberInitExpression expression)
in Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitExpression(Expression expression)
in NHibernate.Linq.Visitors.NhExpressionTreeVisitor.VisitExpression(Expression expression)
in NHibernate.Linq.GroupJoin.GroupJoinAggregateDetectionVisitor.Visit(IEnumerable`1 groupJoinClause, Expression selectExpression)
in NHibernate.Linq.GroupJoin.AggregatingGroupJoinRewriter.IsAggregatingGroupJoin(QueryModel model, IEnumerable`1 clause)
in NHibernate.Linq.GroupJoin.AggregatingGroupJoinRewriter.ReWrite(QueryModel model)
in NHibernate.Linq.Visitors.QueryModelVisitor.GenerateHqlQuery(QueryModel queryModel, VisitorParameters parameters, Boolean root)
in NHibernate.Linq.NhLinqExpression.Translate(ISessionFactoryImplementor sessionFactory)
in NHibernate.Hql.Ast.ANTLR.ASTQueryTranslatorFactory.CreateQueryTranslators(String queryIdentifier, IQueryExpression queryExpression, String collectionRole, Boolean shallow, IDictionary`2 filters, ISessionFactoryImplementor factory)
in NHibernate.Engine.Query.QueryPlanCache.GetHQLQueryPlan(IQueryExpression queryExpression, Boolean shallow, IDictionary`2 enabledFilters)
in NHibernate.Impl.AbstractSessionImpl.GetHQLQueryPlan(IQueryExpression queryExpression, Boolean shallow)
in NHibernate.Impl.AbstractSessionImpl.CreateQuery(IQueryExpression queryExpression)
in NHibernate.Linq.DefaultQueryProvider.PrepareQuery(Expression expression, IQuery& query, NhLinqExpression& nhQuery)
in NHibernate.Linq.DefaultQueryProvider.Execute(Expression expression)
in NHibernate.Linq.DefaultQueryProvider.Execute[TResult](Expression expression)
in Remotion.Linq.QueryableBase`1.GetEnumerator()
in System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
in System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
...
InnerException: