2011-08-22 18 views
9

प्राप्त करने के लिए सबक्वायरी के साथ जुड़ें, मैं अब यह करने के लिए कई घंटों की खोज कर रहा हूं, लेकिन मुझे मदद करने के लिए कुछ भी नहीं मिल रहा है।निबर्ननेट क्वेरीओवर कुल कॉलम

enter image description here

यह SQL क्वेरी मैं चलाने के लिए कोशिश कर रहा हूँ है:

SELECT b.*, a.Assignments FROM Branch b LEFT JOIN (
     SELECT b.BranchID , COUNT(ab.BranchID) AS Assignments 
     FROM Branch b LEFT JOIN AssignmentBranch ab ON b.BranchID = ab.BranchID 
     GROUP BY b.BranchID 
    ) a ON b.BranchID = a.BranchID 

तो, मूल रूप से, मैं शाखाओं की एक सूची प्रदान करना चाहते हैं और

यहाँ डेटाबेस मॉडल है एक नया स्तंभ जो उस शाखा के लिए असाइनमेंट की संख्या का प्रतिनिधित्व करता है।

शाखा मॉडल

public class Branch : IEntity<int> 
{ 
    public virtual int ID 
    { 
     get; 
     set; 
    } 

    public virtual string Name { get; set; } 

    public virtual IList<AssignmentBranch> Assignments { get; set; } 

} 

AssignmentBranch मॉडल

public class AssignmentBranch : IEntity<int> 
{ 
    public virtual int ID 
    { 
     get; 
     set; 
    } 

    public virtual DateTime AssignedOn { get; set; } 

    public virtual Branch Branch { get; set; } 
} 

यहाँ मेरी NHibernate विन्यास है:

<class name="Branch" table="Branch"> 

<id name="ID" column="BranchID"> 
    <generator class="identity"></generator> 
</id> 

<property name="Name"/> 

<bag name="Assignments" cascade="none" inverse="true"> 
    <key column="BranchID"/> 
    <one-to-many class="AssignmentBranch"/> 
</bag> 

<class name="AssignmentBranch" table="AssignmentBranch"> 

<id name="ID" column="AssignmentBranchID"> 
    <generator class="identity"></generator> 
</id> 

<property name="AssignedOn" /> 
<property name="FromDate" /> 
<property name="ToDate" /> 

<many-to-one name="Assignment" column="AssignmentID" /> 
<many-to-one name="Branch" column="BranchID" /> 

मैंने कई तरीकों से यह कोशिश की है, लेकिन मुझे क्वेरीओवर का उपयोग करके उप-क्वेरी में शामिल होने का कोई तरीका नहीं दिख रहा है।

// aliases 
Branch branch = null; AssignmentBranch assignment = null; 

var subquery = QueryOver.Of<Branch>(() => branch) 
    .Where(() => branch.Project.ID == projectID) 
    .JoinQueryOver<AssignmentBranch>(() => branch.Assignments,()=> assignment, 
            NHibernate.SqlCommand.JoinType.LeftOuterJoin) 
    .SelectList(list => list 
         .SelectGroup(x=>x.ID) 
         .SelectCount(()=>assignment.ID) 
        ); 

    var query = session.QueryOver<Branch>(()=>branch) 
        .JoinAlias(???) // how can I join with a sub-query? 
        .TransformUsing(Transformers.AliasToBean<BranchAssignments>()) 
        .List<BranchAssignments>(); 

किसी को भी मेरी मदद कर सकते हैं:

मैं इस तरह की कोशिश की? यह जुड़ने के उप वास्तव में, शायद वहाँ है कि मुझे याद आ रही एक और बेहतर समाधान है ...

धन्यवाद, कॉस्मिन

उत्तर

12

यहाँ में इसी तरह के सवाल के सैकड़ों को पढ़ने के बाद एक साथ रहने के लिए नहीं है , मुझे जवाब मिल गया है: एक सहसंबंधित उप-क्वेरी। इस तरह:

// aliases 
Branch branch = null; AssignmentBranch assignment = null; 

var subquery = QueryOver.Of<AssignmentBranch>(() => assignment) 
    .Where(() => assignment.Branch.ID == branch.ID) 
    .ToRowCountQuery(); 

var query = session.QueryOver<Branch>(() => branch) 
    .Where(() => branch.Project.ID == projectID) 
    .SelectList 
    (
     list => list 
     .Select(b => b.ID) 
     .Select(b => b.Name) 
     .SelectSubQuery(subquery) 
    ) 
    .TransformUsing(Transformers.AliasToBean<BranchAssignments>()) 
    .List<BranchAssignments>(); 

समान प्रश्न मैं से मेरा उत्तर मिल गया this one है।

+0

अच्छा होगा। मैंने सोचा कि आपको पूरी शाखा वस्तु की आवश्यकता है और न केवल कुछ गुण। – Firo

+0

मुझे कुछ शाखा गुणों और असाइनमेंट की गिनती के साथ एक कस्टम इकाई को पॉप्युलेट करने की आवश्यकता है। फिर भी, जवाब देने का समय लेने के लिए धन्यवाद, मुझे लगता है कि आपका जवाब भी दिलचस्प है। – noir

+0

यह बाएं जुड़ने के बजाय एक नेस्टेड सबक्वायरी बनाता है। मैं उम्मीद करता हूं कि यह शामिल होने से बहुत खराब प्रदर्शन करेगा (हालांकि SQL क्वेरी ऑप्टिमाइज़र लगातार मुझे आश्चर्यचकित करता है :-) –

2

यह QueryOver के साथ इतना आसान नहीं है, क्योंकि वर्तमान में FROM खंड में बयान होना संभव नहीं है। एक बात है कि मेरे दिमाग में आता है (नहीं सबसे कारगर तरीका मुझे लगता है कि)

var branches = session.QueryOver<Branch>().Future(); 

var assignmentMap = session.QueryOver<BranchAssignment>() 
    .Select(
     Projections.Group<BranchAssignment>(ab => ab.Branch.Id).As("UserId"), 
     Projections.RowCount()) 
    .Future<object[]>() 
    .ToDictionary(o => (int)o[0], o => (int)o[1]); 

return branches.Select(b => new { Branch = branch, AssignmentCount = assignmentMap[branch.Id] }); 

LINQ के साथ यह वास्तव में

var branchesWithAssignementCount = session.Query<Branch>() 
    .Select(b => new { Branch = b, AssignmentCount = b.Branch.Count }) 
    .ToList(); 
संबंधित मुद्दे