2012-08-13 15 views
6

मैं पुरानी शैली की क्वेरी CreateCriteria() से QueryOver() पर प्रतिक्रिया कर रहा हूं। क्वेरी परिणामों के क्रम में मेरी डब्ल्यूसीएफ सेवा string PropertyName प्राप्त करती है। IQueryable के लिए CreateCriteria() - AddOrder() के लिए मैं इस तरह के ऑर्डर करने के लिए डायनामिक LINQ का उपयोग करता हूं।प्रश्नोत्तरी प्रश्नोत्तरी। स्ट्रिंग्स संपत्ति नामों का उपयोग करके ऑर्डर करें।

IList<object[]> result = 
      GetSession() 
       .QueryOver(() => activity) 
       .JoinAlias(() => activity.ActivityLicense,() => license) 
       .Select(Projections.ProjectionList() 
          .Add(Projections.Count<Activity>(e => e.Id), "ActivityCount") 
          .Add(Projections.Group(() => license.SerialNumber), "SerialNumber") 
          .Add(Projections.Count<Activity>(e => e.MacAdress), "MacAddressCount") 
          .Add(Projections.Count<Activity>(e => e.IpAdress), "IpAddressCount") 
       ) 
       .OrderByAlias("ActivityCount") // Compilation Error - I need such extension method 
       .List<object[]>(); 

स्ट्रिंग प्रॉपर्टी नामों के मामले में ऑर्डर करने के लिए कोई सुझाव कैसे करें?

पुनश्च: मैं Nhibernate को LINQ का उपयोग नहीं कर सकता है: LINQ to NHibernate - .GroupBy().Skip().Take() cause an exception

धन्यवाद!

उत्तर

12

तुम हमेशा मिल सकता है UnderlyingCriteria ...

var q = GetSession() 
       .QueryOver(() => activity) 
       .JoinAlias(() => activity.ActivityLicense,() => license) 
       .Select(Projections.ProjectionList() 
          .Add(Projections.Count<Activity>(e => e.Id), "ActivityCount") 
          .Add(Projections.Group(() => license.SerialNumber), "SerialNumber") 
          .Add(Projections.Count<Activity>(e => e.MacAdress), "MacAddressCount") 
          .Add(Projections.Count<Activity>(e => e.IpAdress), "IpAddressCount") 
       ); 


q.UnderlyingCriteria.AddOrder(new Order("ActivityCount", true)); 

var results = q.List(); 

या आप Projections.Property(propName) में पास करके QueryOver API पर सीधे OrderBy सेट कर सकते हैं IQueryOver

public static IQueryOver<T,T> OrderByAlias(this IQueryOver<T,T> q, string aliasName, bool ascending) 
{ 
    q.UnderlyingCriteria.AddOrder(new Order(aliasName, ascending)); 
    return q; 
} 
+0

धन्यवाद। क्या आईक्रिटिरिया को IQueryOver पर वापस करना संभव है? –

+0

मुझे ऐसा नहीं लगता है, आप क्या कर सकते हैं एक IQueryOver एक्सटेंशन विधि में refactor है। मैं उदाहरण पोस्ट करूंगा ... – dotjoe

0

के लिए एक विस्तार पद्धति के रूप में, के लिए उदाहरण:

var query = GetSession() 
       .QueryOver<Activity>() 
       .OrderBy(Projections.Property("ActivityCount").Desc; 

एस के लिए कोई रास्ता नहीं है और एक स्ट्रिंग द्वारा दिशा, तो आपको एपीआई को सरल बनाने के लिए एक आसान तरीका करना होगा या नहीं।

+0

डीएससीसी संपत्ति मौजूद नहीं है –

संबंधित मुद्दे