2012-11-15 2 views
10

두 클래스 (Request & RequestDetail)가 있습니다. 조인하여 두 클래스 사이에 Linq To NHibernate 쿼리가 필요합니다. I는 q2Where 조건은 추가linq-to-Nhibernate에서 여러 조건으로 join을 사용하는 방법

var q = SessionInstance.Query<Request>() 
     .Where(x => x.State == "Init"); 

var q2 = SessionInstance.Query<RequestDetail>(); 
q2 = q2.Where(xx => xx.Purpose.Contains("Purpose Sample")); // This line has a error When execution ‍‍`q.ToList()‍` 

q = q.Join(q2, request => request.Id, detail => detail.Id, (request, detail) => request); 

return q.ToList(); 

, 결과는 런타임 에러를 갖는다. 예외의 메시지는 다음과 같습니다 Specified method is not supported.

스택 추적 :

at NHibernate.Hql.Ast.ANTLR.PolymorphicQuerySourceDetector.GetClassName(IASTNode querySource) 
    at NHibernate.Hql.Ast.ANTLR.PolymorphicQuerySourceDetector.Process(IASTNode tree) 
    at NHibernate.Hql.Ast.ANTLR.AstPolymorphicProcessor.Process() 
    at NHibernate.Hql.Ast.ANTLR.ASTQueryTranslatorFactory.CreateQueryTranslators(IASTNode ast, String queryIdentifier, String collectionRole, Boolean shallow, IDictionary`2 filters, ISessionFactoryImplementor factory) 
    at NHibernate.Hql.Ast.ANTLR.ASTQueryTranslatorFactory.CreateQueryTranslators(String queryIdentifier, IQueryExpression queryExpression, String collectionRole, Boolean shallow, IDictionary`2 filters, ISessionFactoryImplementor factory) 
    at NHibernate.Engine.Query.QueryPlanCache.GetHQLQueryPlan(IQueryExpression queryExpression, Boolean shallow, IDictionary`2 enabledFilters) 
    at NHibernate.Impl.AbstractSessionImpl.GetHQLQueryPlan(IQueryExpression queryExpression, Boolean shallow) 
    at NHibernate.Impl.AbstractSessionImpl.CreateQuery(IQueryExpression queryExpression) 
    at NHibernate.Linq.NhQueryProvider.PrepareQuery(Expression expression, IQuery& query, NhLinqExpression& nhQuery) 
    at NHibernate.Linq.NhQueryProvider.Execute[TResult](Expression expression) 
    at Remotion.Data.Linq.QueryableBase`1.GetEnumerator() 
    at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) 
    at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source) 

이유는 무엇입니까?

답변

15

버그 일 수 있습니다.

var q = (from request in session.Query<Request>() 
     join detail in session.Query<RequestDetail>() on request.Id equals detail.Id 
     where request.State == "Init" && detail.Purpose.Contains("Purpose Sample") 
     select request).ToList(); 
+5

이 답변이 세계에 발표 될 필요가 여기에

이 문제에 대한 해결 방법입니다! 이것이 가능하고 작동하는 방식입니다! 나는 얼마나 많은 시간 동안 우리가 보았는지, 무시 무시한 QueryOver 물건 이외의 해결책을 찾지 못했거나, 새로운 매핑을 만들어야한다는 것을 믿을 수 없다! – user2415376

1

유창-표기 :

var q = session.Query<Request>() 
     .Join(session.Query<RequestDetail>(), request => request.Id, detail => detail.Id, (request, detail) => new { 
      r = request, 
      d = detail 
     }) 
     .Where(rd => rd.r.State == "Init" && rd.d.Purpose.Contains("Purpose Sample")) 
     .Select(rd => rd.r) 
     .ToList();