2012-02-15 9 views
5

मैं निम्नलिखित दो तालिकाओं है:NHibernate - वाम मिलती

नौकरियां AreaID, JobNo (समग्र कुंजी)

लॉग्स LogID, AreaID, JobNo

मैं सभी नौकरियों प्राप्त करने की आवश्यकता जिनके पास उनके साथ जुड़े कोई लॉग नहीं हैं। एसक्यूएल में मैं कर सकता था:

SELECT Jobs.AreaID, 
     Jobs.JobNo 
FROM Jobs 
     LEFT JOIN Logs 
      ON Jobs.AreaID = Logs.AreaID 
      AND Jobs.JobNo = Logs.JobNo 
WHERE Logs.LogID is null 

लेकिन मुझे यकीन नहीं है कि इसे एनएचबीर्नेट के साथ कैसे पूरा किया जाए। क्या कोई भी पॉइंटर्स पेश कर सकता है?

यहाँ मेरी मैपिंग हैं:

<class name="Job" table="Jobs"> 
    <composite-key name="Id"> 
     <key-property name="JobNo"/> 
     <key-many-to-one name="Area" class="Area" column="AreaID"/> 
    </composite-key> 
</class> 

<class name="Log" table="Logs"> 
    <id name="Id" column="LogID"> 
     <generator class="identity"/> 
    </id> 
    <property name="JobNo"/> 
    <many-to-one name="Area" class="Area" column="AreaID"/> 
</class> 

धन्यवाद

अद्यतन

ठीक है, मैं Nosila का जवाब थोड़ा संशोधित, और यह अब क्या कर रहा है कि मैं क्या चाहता था:

Log logs = null; 

return session.QueryOver<Job>() 
    .Left.JoinAlias(x => x.Logs,() => logs) 
    .Where(x => logs.Id == null) 
    .List<Job>(); 

मुझे इसे अपने नौकरी में भी जोड़ना पड़ा मानचित्रण:

<bag name="Logs"> 
    <key> 
     <column name="JobNo"></column> 
     <column name="DivisionID"></column> 
    </key> 
    <one-to-many class="Log"/> 
</bag> 

सहायता के लिए धन्यवाद। :)

+0

क्या आप अब अपनी क्वेरी पोस्ट कर सकते हैं? – Nosila

+0

उपर्युक्त SQL क्वेरी वर्तमान में मैं उपयोग कर रहा हूं। मैं इस समय एनएच सीख रहा हूं और इसका उपयोग करने के लिए एक छोटे से एप्लिकेशन को बदलने की कोशिश कर रहा हूं। – Tom

+0

क्या आपके मैपिंग्स हैं? साथ ही, अगर कोई गलत है तो कोई मुझे सही करता है लेकिन मुझे लगता है कि आपको शामिल होने के लिए शर्तों को जोड़ने के लिए आपको एनएचबीरनेट 3.2 की आवश्यकता है ('क्वेरीओवर' एपीआई का उपयोग करके, वैसे भी)। – Nosila

उत्तर

6

मैं समग्र पहचानकर्ताओं से परिचित नहीं हूं क्योंकि मैं उनका उपयोग नहीं करता हूं, इसलिए मुझे पता है कि NHibernate स्वचालित रूप से उचित बाएं शामिल हो जाएगा। कोई भी कम नहीं, नीचे (गैर-परीक्षण) क्वेरी आपको शुरू करनी चाहिए।

Job jobAlias = null; 
Log logAlias = null; 
YourDto yourDto = null; 

session.QueryOver<Job>() 
    // Here is where we set what columns we want to project (e.g. select) 
    .SelectList(x => x 
     .Select(x => x.AreaID).WithAlias(() => jobAlias.AreaID) 
     .Select(x => x.JobNo).WithAlias(() => jobAlias.JobNo) 
    ) 
    .Left.JoinAlias(x => x.Logs,() => logAlias, x.JobNo == logAlias.JobNo) 
    .Where(() => logAlias.LogID == null) 
    // This is where NHibernate will transform what you have in your `SelectList()` to a list of objects 
    .TransformUsing(Transformers.AliasToBean<YourDto>()) 
    .List<YourDto>(); 

public class YourDto 
{ 
    public int AreaID { get; set; } 
    public int JobNo { get; set; } 
} 

नोट: जुड़ने की स्थितियों को सेट करने के लिए आपको NHibernate 3.2 की आवश्यकता है।

+1

धन्यवाद। मुझे इस पर झुकाव करना होगा (इसमें कुछ त्रुटियां हैं)। यह इतनी सरल क्वेरी के लिए बेहद जटिल लगता है। – Tom

+0

@ टॉम मैं जटिलता से सहमत हूं, एसक्यूएल में इसे लिखना बहुत आसान होगा। मुझे लगता है कि ओआरएम अमूर्त हाथ से बाहर हो रहा है। – Jafin

4
Job job = null; 
var jobsWithoutLogs = session.QueryOver(() => job) 
    .WithSubquery.WhereNotExists(QueryOver.Of<Log>() 
     .Where(log => log.Job == job) 
     .Select(Projections.Id())) 
    .List() 

अद्यतन: मैंने देखा कि आपने मानचित्रण जोड़ा है। उपरोक्त कोड केवल निम्नलिखित मैपिंग के लिए काम करता है

<class name="Log" table="Logs"> 
    <id name="Id" column="LogID"> 
     <generator class="identity"/> 
    </id> 
    <many-to-one name="Job" > 
     <column name="JobNo"/> 
     <column name="AreaID"/> 
    <many-to-one /> 
</class> 
+0

अच्छा। मुझे यह समाधान बेहतर पसंद है। – Nosila

+0

यह आसान प्रतीत होता है, हालांकि मुझे त्रुटि मिल रही है "प्रक्षेपण के बिना मानदंडों पर सबक्वायरी का उपयोग नहीं कर सकता"। साथ ही, क्या यह एक अधिक महंगी क्वेरी होने जा रहा है क्योंकि यह सरल बाएं जुड़ने के बजाय सबक्वायरीज़ का उपयोग कर रहा है? – Tom

+0

1) प्रक्षेपण जोड़ा गया। 2) मैं इसे एक ही काम करने के बाद से अधिक महंगा नहीं लगता। आप क्वेरी प्लान – Firo