7

मेरे पास एनएचबीरनेट लिंक क्वेरी है जो काम नहीं कर रही है कि मैं कैसे उम्मीद करूंगा।एनएचबेर्नेट एक बुरे जुड़ने के साथ एसक्यूएल का उत्पादन कर रहा है

समस्या जहां खंड में बाईं बाएं तालिका से एक निरर्थक int कॉलम का उपयोग करने से आती है। यह एक आंतरिक शामिल होने की तरह कार्य करने के लिए शामिल हो रहा है।

var list = this.WorkflowDiaryManager.WorkflowActionRepository.All 
    .Fetch(x => x.CaseView) 
    .Fetch(x => x.WorkflowActionType) 
    .ThenFetchMany(x => x.WorkflowActionPriorityList) 
    .Where(x => x.AssignedUser.Id == userId || x.CaseView.MooseUserId == userId) 

एसक्यूएल इस द्वारा उत्पादित की तरह दिखता है (के बाद से शामिल होने के - आप सभी चयन को देखने के लिए की जरूरत नहीं है)

from Kctc.WorkflowAction workflowac0_ 
left outer join Kctc.WorkflowCaseView workflowca1_ on workflowac0_.CaseId=workflowca1_.CaseId 
left outer join Kctc.WorkflowActionType workflowac2_ on workflowac0_.WorkflowActionTypeId=workflowac2_.WorkflowActionTypeId 
left outer join Kctc.WorkflowActionPriority workflowac3_ on workflowac2_.WorkflowActionTypeId=workflowac3_.WorkflowActionTypeId 
,Kctc.WorkflowCaseView workflowca4_ 
where workflowac0_.CaseId=workflowca4_.CaseId 
and ([email protected] or workflowca4_.[MooseUserId][email protected]); 
@p0 = 1087 [Type: Int32 (0)], 
@p1 = 1087 [Type: Int32 (0)] 

तो बात यह है कि समस्या का कारण है की लाइन 5 ऊपर स्निपेट। जैसा कि आप देख सकते हैं, NHBernate मेरे वर्कफ़्लो कैस व्यू व्यू पर 'पुराने स्कूल' में शामिल होने का प्रयास कर रहा है। इससे प्रश्न अन्यथा वैध क्रियाओं को बाहर करने का कारण बनता है जिनके पास वर्कफ़्लोएक्शन तालिका में केसआईडी नहीं है।

क्या कोई यह समझा सकता है कि NHBernate इस SQL ​​को क्यों लिख रहा है, और मैं बेहतर क्वेरी बनाने के लिए इसे कैसे प्रोत्साहित कर सकता हूं?

धन्यवाद!

WorkflowCaseViewMap

 Table("Kctc.WorkflowCaseView"); 
     Id(x => x.Id).Column("CaseId"); 
     Map(x => x.MooseUserId).Nullable(); 

से

 Table("Kctc.WorkflowAction"); 
     Id(x => x.Id).GeneratedBy.Identity().Column("WorkflowActionId"); 
     References(x => x.WorkflowActionType).Column("WorkflowActionTypeId").Unique(); 
     References(x => x.CompletedBy).Column("CompletedBy"); 
     References(x => x.CaseView).Column("CaseId").Not.Update().Unique(); 
     References(x => x.AssignedUser).Column("AssignedUser"); 

महत्वपूर्ण बिट्स WorkflowActionMap से महत्वपूर्ण बिट्स इस को देखते हुए, मुझे आश्चर्य है कि अगर मैं एक HasMany वापस अन्य रास्ते पर जा रहा है चाहिए ...

संपादित करें।

उत्तर

0

मैंने संग्रहीत प्रक्रिया का उपयोग करके इसे शामिल करने के लिए लागू किया है। उम्मीद है कि NHBernate जल्द ही इस बग को ठीक करेगा।

3

मदद करने के लिए प्रतीत नहीं होता है मैं तुम्हें यह करने के लिए अपने Where खंड बदलने की जरूरत है लगता है: अपने वर्तमान Where खंड आप NHibernate बता दूँ कि वहाँ हमेशा एक CaseView हो जाएगा

.Where(x => x.AssignedUser.Id == userId || 
     (x.CaseView != null && x.CaseView.MooseUserId == userId)) 

, क्योंकि आप बिना शर्त का उपयोग अपने गुण। इस जानकारी के आधार पर NHibernate आपकी क्वेरी को left outer join से inner join (जो "पुराना स्कूल" शामिल है)

+0

त्वरित उत्तर के लिए धन्यवाद। मैंने आपके सुझाव की कोशिश की है (और मैं खुद ही एक ही चीज़ के साथ आया था, बस इसका उपयोग कर रहा था! = नल) और इससे मदद नहीं मिली। –

+0

@ मार्कविचर्स: यदि आप उस हिस्से को 'कहां' खंड से पूरी तरह से हटा देते हैं तो क्या होता है? 'वर्कफ़्लो कैसएक्शन' और 'वर्कफ़्लो कैस व्यू' के बीच आपका मानचित्रण कैसा है? –

+0

अगर मैं "|| x.CaseView.MooseUserId == userId" को हटा देता हूं, जहां से यह खंड के बिना कार्रवाई को वापस लाता है और तीन बाएं बाहरी जुड़ता है, जैसा कि मैं उम्मीद करता हूं। –

0

फ़्लुएंट एनएचबेर्नेट का उपयोग करने का प्रयास करें। निम्नलिखित की तरह कुछ सही गेंद पार्क में आप मिलना चाहिए:

var List<WorkflowAction> = FluentSessionManager.GetSession().CreateCriteria<WorkflowAction>() 
     .SetFetchMode("CaseView", FetchMode.Eager) 
     .SetFetchMode("WorkflowActionType", FetchMode.Eager) 
     .SetFetchMode("WorkflowActionPriorityList", FetchMode.Eager) 
     .CreateAlias("AssignedUser", "au") 
     .CreateAlias("CaseView", "cv") 
     .Add(Expression.Or(Expression.Eq("au.Id", userId), Expression.Eq("cv.MooseUserId", userId))) 
     .List<WorkflowAction>(); 

ध्यान रखें, मैं एक विशेष वर्ग है कि FluentSessionManager.GetSession() जहाँ मैं यह एक सरल सहायक वर्ग के साथ या एक पर सीधे कॉल कर सकते हैं प्रदान करता है पेज के आधार पर पेज। FluentSessionManager का आपका सेटअप काफी अलग हो सकता है। लेकिन आखिरकार ".CreateCriteria() ..." आपका कोड और मेरा मिलान होना चाहिए। मान लें कि "वर्कफ़्लोएक्शन" वह तालिका है जिस पर क्वेरी को बुलाया जा रहा है।

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^