2010-11-25 3 views
5

मैं nhibernate 3 सीआर का परीक्षण कर रहा हूँ, लेकिन LINQ का उपयोग निम्नलिखित एसक्यूएल बनाने के लिए विफल रहता है:Nhibernate 3 Linq - भीतरी मिलती

select * 
    from  Users    as {user} 
    inner join Test    as test on test.UserId = user.Id 
    inner join Release    as release on release.TestId = test.TestId 
    where Release.Status = 1 
    order by count(release.Status) desc; 

मैं अब तक नहीं मिला है, मेरे वर्तमान कोड इस तरह है और देता है मुझे कुछ अलग अलग:

var users = from user in Session.Query<User>() 
      join test in Session.Query<Test>() on user.Id equals test.User.Id 
      join release in Session.Query<Release>() on test.Id equals release.Test.Id 
      where release.Status == 1 
      orderby release.Status 
      descending 
      select user; 

क्या linq के साथ आंतरिक जुड़ने का उपयोग करने के तरीके पर कोई संसाधन है? और क्या मैं के साथ क्या करना चाहिए:

order by count(release.Status) 

यह कुछ ऐसा है QueryOver साथ बजाय किया जाना चाहिए है?

+1

मैपिंग के बजाय आप क्वेरी में इकाइयों के बीच रिश्तों को परिभाषित क्यों करते हैं? – Paco

+0

मैं सिर्फ विरासत अनुप्रयोग पर linq का परीक्षण कर रहा था। तो इस तरह एसक्यूएल की तरह लग रहा था। मैं मैपिंग्स के पुनर्लेखन को गंध कर सकता हूं, लेकिन यहां बिंदु यह देखने के लिए था कि लिंक को कितना दूर विकसित करना था। और ऐसा लगता है कि यह बहुत उपयोगी नहीं है। – bondehagen

उत्तर

4

AFAIK, एनएच अभी भी linq अच्छी तरह से जुड़ने का समर्थन नहीं करता है। एचक्यूएल, या यहां तक ​​कि क्वेरीओवर का उपयोग करने के लिए बेहतर (मुझे लगता है कि सरल प्रश्नों के लिए यह सबसे अच्छा है)। इस उदाहरण को देखें:

// just to assign aliases, not for real use: 
Test qtest = null; 
Release qrel = null; 

// do query 
var data = Session.QueryOver<User>() 
    .JoinAlias(quser => quser.Tests,() => qtest) 
    .JoinAlias(quser => quser.Releases,() => qrel) 
    .Where(() => qrel.Status == 1) 
    .OrderBy(() => qrel.Status).Desc 
    .List(); 
6

सबसे पहले, आईडी द्वारा शामिल होने की कोशिश करने के बजाय अपने मॉडल में संबंधों को परिभाषित करें।

तो फिर तुम यह करने के लिए सक्षम हो जाएगा:

from release in session.Query<Release>() 
where release.Status == 1 
select release.Test.User 

सभी जिसकी कमी है orderby, जो मुझे नहीं लगता है सही (आप एक समग्र द्वारा ऑर्डर करने के लिए कोशिश कर रहे हैं करना है, लेकिन आप कर रहे हैं समूह द्वारा निर्दिष्ट नहीं करना)

+0

यह बाहरी शामिल होने का कारण बनता है और प्रभावशाली नहीं है क्योंकि आंतरिक –

+0

@ सईद में शामिल है: मुझे एक प्रोफाइलिंग सत्र दिखाएं जो यह प्रासंगिक है। –

+0

मैंने वर्तमान में नहीं देखा लेकिन मुझे पता है कि काम से कैसे। –