2012-03-15 7 views
10

मैं NHibernate 3.2 में इस सरल LINQ क्वेरी मिल गया है और SQLite प्रदाता के साथ ले() को छोड़ (:NHibernate LINQ प्रदाता और) उत्सुक प्राप्त करने में कठिनाई

var all = (from book in Session.Query<Book>() select book) 
    .Skip(15) 
    .Take(15)     
    .ToList(); 

इस क्वेरी सही ढंग से रिटर्न 15 संस्थाओं, लेकिन जब मैं करने की कोशिश FetagerMany के साथ एक आश्रित संग्रह को उत्सुक लोड करें:

var all = (from book in Session.Query<Book>() select book) 
    .FetchMany(books => books.Authors) 
    .Skip(15) 
    .Take(15)     
    .ToList(); 

मुझे केवल 11 इकाइयां मिलती हैं। क्या यह एक बग या कुछ है जो मुझे याद आ रही है?

यहाँ जिसके परिणामस्वरूप SQL क्वेरी

select 
    book0_.Id as Id2_0_, 
    author2_.Id as Id0_1_, 
    book0_.Title as Title2_0_, 
    book0_.Sort as Sort2_0_, 
    book0_.TimeStamp as TimeStamp2_0_, 
    book0_.PubDate as PubDate2_0_, 
    book0_.Series_Index as Series6_2_0_, 
    book0_.Author_Sort as Author7_2_0_, 
    book0_.Isbn as Isbn2_0_, 
    book0_.Lccn as Lccn2_0_, 
    book0_.Path as Path2_0_, 
    book0_.Flags as Flags2_0_, 
    book0_.Uuid as Uuid2_0_, 
    book0_.Has_Cover as Has13_2_0_, 
    book0_.Last_Modified as Last14_2_0_, 
    author2_.Name as Name0_1_, 
    author2_.Sort as Sort0_1_, 
    author2_.Link as Link0_1_, 
    authors1_.book as book0__, 
    authors1_.author as author0__ 
from 
    books book0_ 
    left outer join 
    books_authors_link authors1_ on book0_.Id=authors1_.book left outer join authors author2_ 
    on authors1_.author=author2_.Id 
order by book0_.Id asc 
limit 15 /* @p0 */ offset 0 /* @p1 */ 

यह प्रभावी रूप से परिणाम 15 पंक्तियों के लिए सेट सीमित करता है और नहीं के रूप में 15 संस्थाओं मैं करने का इरादा है।

+0

एनएचबर्ननेट जैसे लगता है कि यह एक बाएं शामिल होने पर आंतरिक जुड़ना उत्पन्न कर रहा है। मैं संपत्ति लेखकों के लिए मैपिंग पर एक अतिरिक्त नज़र डालेगा। –

+0

मुझे लगता है, यह समस्या नहीं है क्योंकि मेरे पास प्रत्येक पुस्तक के लिए कम से कम एक लेखक है। और जब प्रत्येक पुस्तक के लिए फ़ोरैच लूप में लेखकों को लाते हैं, तो मुझे सही परिणाम मिलते हैं। – zszep

+0

दिलचस्प बात यह है कि मुझे 15 पंक्तियां मिलती हैं, लेकिन केवल 11 इकाइयां होती हैं। दो पुस्तकों में दो लेखकों हैं और एक पुस्तक में तीन लेखकों हैं। क्या मैं उस स्किप को सही करता हूं और वापस लौटाई गई इकाइयों की संख्या को सीमित करना चाहिए, न कि पंक्तियां? – zszep

उत्तर

12

छोड़ें और एसक्यूएल में समकक्षों का अनुवाद करें जो पंक्तियों पर सीमित हैं और चूंकि आप शामिल होने के साथ उत्सुक हैं क्योंकि आप इसके बारे में ज्यादा कुछ नहीं कर सकते हैं।

उत्सुक लाने पहले 15 पुस्तकों के लिए

आप की जरूरत है:

var all = Session.Query<Book>() 
    .Skip(15) 
    .Take(15)     
    .ToList(); 

var ids = all.Select(b => b.Id).ToList(); 

// fetch all Authors of the books, now the books in all have initialized Authors 
Session.Query<Book>() 
    .Where(b => ids.Contains(b.Id)) 
    .FetchMany(books => books.Authors) 
    .List(); 

इस है 2 हालांकि roundtrips

अद्यतन: QueryOver के साथ एक गोल यात्रा, शायद आप Linq

में
var subquery = QueryOver.Of<Book>() 
    .Skip(15) 
    .Take(15) 
    .Select(b => b.Id); 

var all = Session.QueryOver<Book>() 
    .WithSubquery.WhereProperty(b => b.Id).In(subquery) 
    .Fetch(books => books.Authors).Eager 
    .ToList(); 
+0

समस्या के बारे में सोचने के बाद, मैं एक ही निष्कर्ष पर आया, हालांकि यह दयालु है। जब कोई ले लेते हैं (15) निर्दिष्ट करते हैं और क्वेरी को जेनेरिक टाइप बुक के रूप में सेट करते हैं तो 15 किताबें प्राप्त करने की उम्मीद होगी। मैंने एक एसक्यूएल स्टेटमेंट बनाने की कोशिश की जो ऐसा करेगी लेकिन समाधान के बारे में नहीं सोच सका। तो फिर यह दो प्रश्न होंगे। – zszep

0
अनुवाद कर सकते हैं
var data = session.QueryOver<EmployeeDetails>() 
            .Where(x => x.Salary > 2000) 
            //.Take(2) 
            .Skip(2) 
            .Take(2) 
            .List(); 
       //if take is before skip then it will skip the last (mentioned digits) rows 
       //if take is after skip then it will skip the first (mentioned digits) rows 
संबंधित मुद्दे