如何使用Linq To Nhibernate编写简单的左连接

时间:2014-10-27 10:40:44

标签: c# .net linq nhibernate left-join

我的目标是编写一个简单的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: 

0 个答案:

没有答案