2011-03-21 10 views
6

पृष्ठभूमि के साथ एचक्यूएल के लिए एनएचबीर्नेट फ्लेंट (क्वेरीओवर) प्रतिस्थापन FluentNHibernate का उपयोग करके, आखिरी देव बिल्ड एनएचबीर्नेट 3.0 के साथ काम कर रहा है।सहसंबंधित सबक्वायरी

यहाँ WorkIncident के लिए प्रकार घोषणाओं है:

// Enumeration used in class below. 
public enum TicketStatus 
{ 
    Open = 1, 
    Closed = 10, 
    Hold = 20 
} 

// Ticket class. 
public class WorkIncident 
{ 
    public virtual int EntryId { get; set; } 
    public virtual int TicketNumber { get; set; } 
    public virtual string ModifierNtId { get; set; } 
    public virtual DateTime ModifiedDate { get; set; } 
    public virtual TicketStatus Status { get; set; } 
    public virtual int Version { get; set; } 
    public virtual string Title { get; set; } 
    public virtual string Details { get; set; } 
} 

// FluentNHibernate mapping 
public class WorkIncidentMap : ClassMap<WorkIncident> 
{ 
    public WorkIncidentMap() 
    { 
     Table("incident_details"); 
     Id(wi => wi.EntryId, "wiid"); 
     Map(wi => wi.TicketNumber, "workitem_number"); 
     Map(wi => wi.Title, "workitem_title"); 
     Map(wi => wi.Details, "workitem_comment"); 
     Map(wi => wi.ModifiedDate, "workitem_modified_on"); 
     Map(wi => wi.ModifierNtId, "modified_by_worker_nt_id"); 
     Map(wi => wi.Status, "workitem_status_lookup_id").CustomType<EnumType<Status>>(); 
     Map(wi => wi.Version, "workitem_version"); 
    } 
} 

मानचित्रण ठीक काम करता है, और मैं कोई समस्या नहीं के साथ निम्नलिखित की तरह प्रश्नों कर सकते हैं:

session.QueryOver<AltirisIncident>() 
    .Where(ai => ai.ModifierNtId == worker.Name.Replace("\\", @"\")) 
    .AndRestrictionOn(ai => ai.ModifiedDate) 
    .IsBetween(DateTime.Today) 
    .And(DateTime.Today.AddDays(1)) 
    .List<WorkIncident>(); 

यह मैं काम के सभी देता है वस्तुओं (मूल रूप से डेस्क परेशानी टिकटों की सहायता) वर्तमान तारीख पर एक विशिष्ट उपयोगकर्ता द्वारा छुआ।

from WorkIncident as t1 
where t1.ModifierNtId = :ntid 
and  t1.ModifiedDate between :startdate and :enddate 
and  t1.Status = :status 
and  (t1.Version = 1 
or  t1.TicketNumber in (
    select t2.TicketNumber 
    from  WorkIncident as t2 
    where  t2.Status != t1.Status 
    and  t2.TicketNumber = t1.TicketNumber 
    and  t2.Version = t1.Version - 1)) 

इस क्वेरी मुझे सब काम आइटम है कि एक बंद स्थिति में एक कार्यकर्ता द्वारा रखा गया था की सूची देता है:

हालांकि, मैं मुसीबत एक धाराप्रवाह घोषणा में निम्नलिखित HQL का अनुवाद होने की है। डेटाबेस में टिकटों को संग्रहीत करने के तरीके को देखते हुए (प्रत्येक टिकट में एकाधिक रिकॉर्ड होते हैं (प्रत्येक अपडेट के लिए एक) और पर्यवेक्षक अक्सर एक कर्मचारी को बंद करने के बाद टिकट में नोट्स जोड़ते हैं, ऐसी स्थितियों की ओर जाता है जहां मैं केवल देख नहीं सकता एक बंद की स्थिति के साथ पिछले संस्करण संख्या मज़बूती से मुझे बताने की जो एक टिकट बंद कर दिया।

किसी भी मदद की बहुत सराहना की जाएगी, जैसा कि मैंने जितना संभव हो उतना HQL और जादू तार से दूर जाने की पसंद करेंगे।

उत्तर

0

मुझे लगता है कि यह चाल चलाना चाहिए। कठिन हिस्सा वास्तव में उस गणितीय ऑपरेशन को संभालने में है जो आपको मिल गया है। आपको SQLFunction अनुमानों में जाना होगा

session.QueryOver<WorkIncident>(() => t1Alias) 
       .Where(w => w.ModifierNtId == "test") 
       .And(w => w.ModifiedDate < DateTime.Now && w.ModifiedDate > DateTime.Now) 
       .And(w => w.Status == TicketStatus.Open) 
       .And(Restrictions.Disjunction() 
        .Add(Restrictions.Where<WorkIncident>(w => w.TicketNumber == 1)) 
        .Add(Subqueries.WhereProperty(() => t1Alias.TicketNumber).In(
         QueryOver.Of<WorkIncident>(() => t2Alias) 
           .Where(() => t2Alias.Status != t1Alias.Status) 
           .And(() => t2Alias.TicketNumber == t1Alias.TicketNumber) 
           .And(Restrictions.EqProperty(
            Projections.Property<WorkIncident>(w=> w.Version), 
            Projections.SqlFunction(
             new VarArgsSQLFunction("(","-",")"), 
             NHibernateUtil.Int32, 
             Projections.Property(()=> t1Alias.Version), 
             Projections.Constant(1) 
            ))) 
           .Select(w => w.TicketNumber))) 
       ).List(); 

मेरे परीक्षण में, इसने निम्नलिखित SQL

SELECT <snip...> 
FROM incident_details this_ 
WHERE this_.modified_by_worker_nt_id = @p0 
    and (this_.workitem_modified_on < @p1 and this_.workitem_modified_on > @p2) 
    and this_.workitem_status_lookup_id = @p3 
    and (this_.workitem_number = @p4 
    or this_.workitem_number in 
     (SELECT this_0_.workitem_number as y0_ 
     FROM incident_details this_0_ 
     WHERE not (this_0_.workitem_status_lookup_id = this_.workitem_status_lookup_id) 
     and this_0_.workitem_number = this_.workitem_number 
     and this_0_.workitem_version = ([email protected]))); 
     @p0 = 'test' [Type: String (0)], @p1 = 10/26/2012 11:26:24 PM [Type: DateTime (0)], @p2 = 10/26/2012 11:26:24 PM [Type: DateTime (0)], @p3 = 1 [Type: Int32 (0)], @p4 = 1 [Type: Int32 (0)], @p5 = 1 [Type: Int32 (0)] 
उत्पन्न किया
संबंधित मुद्दे