2012-11-15 20 views
10

में एकाधिक स्थितियों के साथ जुड़ने का उपयोग कैसे करें मेरे पास दो कक्षाएं हैं (अनुरोध & RequestDetail)। मुझे जुड़ने के द्वारा दो कक्षाओं के बीच Linq To NHibernate क्वेरी की आवश्यकता है।linq-to-Nhibernate

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(); 

जब मैं q2 करने के लिए एक Where शर्त का जोड़ा, परिणाम एक रनटाइम त्रुटि है। अपवाद के संदेश है: 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

इस उत्तर वर्ल्ड करने की घोषणा की जाने की आवश्यकता है

यहाँ आपकी समस्या के लिए समाधान नहीं है! यह वही तरीका है जो यह कर सकता है और काम करता है! मैं विश्वास नहीं कर सकता कि हमने कितनी बार देखा है और भयानक प्रश्नोत्तरी सामान के अलावा कोई समाधान नहीं मिला है, या नए मैपिंग बनाने के लिए मजबूर किया जा रहा है! – 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();