2010-02-05 15 views
6

में अनुमान किसी इकाई में मानदंड आईडी, उपयोगकर्ता नाम, आयु, पता हैं। अब मैं सिर्फ आईडी और उपयोगकर्ता नाम चाहता हूं और मैं इसके लिए इस कोड का उपयोग करता हूं।NHibernate

अनुमान एक क्वेरी से इकाइयों की सूची के अलावा किसी अन्य चीज़ को वापस करने में सक्षम बनाता है।

var proj = Projections.ProjectionList() 
    .Add(Projections.Property("Id"), "Id") 
    .Add(Projections.Property("Username"), "Username"); 

var list2 = DetachedCriteria.For<User>() 
    .Add(Expression.Eq("Username", "lachlan")) 
    .GetExecutableCriteria(sessionFactory.GetCurrentSession()) 
    .SetProjection(proj) 
    .List(); 

मैं मूल्यों को कैसे प्राप्त करूंगा। इन वस्तुओं को किस मूल्य में लिया जाएगा।

उत्तर

27

जब तक परिणाम ट्रांसफॉर्मर का उपयोग नहीं किया जाता है, तो प्रक्षेपण के परिणामस्वरूप अनुमानित मानों के साथ अज्ञात वस्तुओं की एक सूची होगी। यह डाटाबेसिंग के लिए पर्याप्त होगा।

अन्य उपयोगों के लिए, आप एक परिणाम ट्रांसफॉर्मर सेट करना चाहते हैं जो एक ज्ञात प्रकार की वस्तुएं बनाएगा। AliasToBeanTransformer प्रत्येक पंक्ति के लिए निर्दिष्ट प्रकार का ऑब्जेक्ट बनाएगा, और इसकी गुण पंक्ति मानों पर सेट करेगा।

यदि आप परिणामों के प्रकार को जानते हैं, तो आप जेनेरिक List<T>() विधि का उपयोग कर सकते हैं।

var proj = Projections.ProjectionList() 
    .Add(Projections.Property("Id"), "Id") 
    .Add(Projections.Property("Username"), "Username"); 

var list2 = DetachedCriteria.For<User>() 
    .Add(Expression.Eq("Username", "lachlan")) 
    .GetExecutableCriteria(sessionFactory.GetCurrentSession()) 
    .SetProjection(proj) 
    .SetResultTransformer(Transformers.AliasToBean(typeof(Result))) 
    .List<Result>(); 

परिणाम ट्रांसफॉर्मर का उपयोग एसक्यूएल और एचक्यूएल प्रश्नों पर भी किया जा सकता है।

list2 = Session.CreateSQLQuery("select Id, Username from user_table") 
    .SetResultTransformer(Transformers.AliasToBean(typeof(Result))) 
    .List<Result>(); 

list2 = Session.CreateQuery("select Id, Username from User") 
    .SetResultTransformer(Transformers.AliasToBean(typeof(Result))) 
    .List<Result>(); 

इन उदाहरणों में परिणाम वर्ग को मैप किए गए वर्ग की आवश्यकता नहीं है, और इसमें चयनित गुण होना चाहिए।

partial class Result 
{ 
    public int Id { get; set; } 
    public string Username { get; set; } 
} 
+0

हालांकि मैंने 3.0 फ्रेमवर्क (var कीवर्ड) का उपयोग नहीं किया, मैं अंत में यह पता लगाने में सक्षम था कि इस उत्तर का उपयोग करके व्यक्तियों के कॉलम का चयन कैसे करें! इसे खोजने के लिए मुझे पूरे दिन ले गया –