2012-02-10 8 views
6

का उपयोग कर रहा डेटाबेस से कुछ डेटा प्राप्त है और एक डीटीओ वापस जाने के लिए एक बहुत ही बुनियादी जरूरत है। मैंने पाया कि एनएचबर्ननेट और "प्रोजेक्टिंग" का उपयोग करके कई टेबलों में शामिल होने के लिए, एक डीटीओ को कोड का थोड़ा सा होना है। कई उदाहरण को देखने के बाद, सबसे जो मुझे शून्य मान के साथ एक डीटीओ छोड़ने काम नहीं किया, मैं निम्नलिखित और यदि आप nHibernate निंजा के बाहर वहाँ मुझे बता सकते हैं अगर वहाँ एक बेहतर तरीका है सोच रहा था के साथ कैम।nHibernate कई तालिकाओं में शामिल होने और AliasToBean ट्रांसफार्मर

public IOpenIdUser GetOpenIdUser(string claimedIdentifier, IOpenIdUser openIdUserDto) 
    { 
     User user = null; 
     OpenIdUser openIdUser = null; 
     Profile profile = null; 
     UserType userType = null; 


     return 
      SessionWrapper.Session.QueryOver(() => user).JoinAlias(() => user.Profiles,() => profile). 
       JoinAlias(() => user.OpenIdUsers,() => openIdUser).JoinAlias(() => user.UserType,() => userType) 
       .Where(() => user.UserName == claimedIdentifier) 
       .SelectList(l => l 
            .Select(x => openIdUser.OpenIdUserId).WithAlias(() => openIdUser.OpenIdUserId) 
            .Select(x => user.UserId).WithAlias(() => openIdUserDto.UserId) 
            .Select(x => openIdUser.OpenIdClaimedIdentifier).WithAlias(
             () => openIdUserDto.ClaimedIdentifier) 
            .Select(x => openIdUser.OpenIdFriendlyIdentifier).WithAlias(
             () => openIdUserDto.FriendlyIdentifier) 
            .Select(x => openIdUser.OpenIdEndPoint).WithAlias(
             () => openIdUserDto.OpenIdEndPoint) 
            .Select(x => user.UserName).WithAlias(() => openIdUserDto.UserName) 
            .Select(x => userType.Type).WithAlias(() => openIdUserDto.UserType) 
            .Select(x => profile.DisplayName).WithAlias(() => openIdUserDto.DisplayName) 
            .Select(x => profile.EmailAddress).WithAlias(() => openIdUserDto.EmailAddress) 
            .Select(x => openIdUser.DateCreated).WithAlias(() => openIdUserDto.DateCreated) 
            .Select(x => openIdUser.LastUpdated).WithAlias(() => openIdUserDto.LastUpdated) 
            .Select(x => openIdUser.UsageCount).WithAlias(() => openIdUserDto.UsageCount) 
       ).TransformUsing(Transformers.AliasToBean<OpenIdUserDto>()).Future<OpenIdUserDto>().Single(); 
    } 

यह विधि मेरे उपयोगकर्ता रिपोजिटरी में बैठती है और इसे मेरे उपयोगकर्ता सेवा द्वारा बुलाया जाता है। कृपया यह नहीं कि यह वास्तव में काम करता है, मुझे लगता है कि यह इतना आसान काम के लिए अधिक है। कृपया ध्यान दें कि मैं इसके लिए नया हूं इसलिए यदि यह कोड क्रोधित है तो मैं पहले से माफ़ी मांगता हूं।

+0

मैं इस किसी के लिए काम किया लगता है। मुझे वोट मिला .. W00t! – CrazyCoderz

उत्तर

2

आप Queryover का उपयोग करते हैं तो यह एक ही रास्ता है।

क्या तुम सच में लगता है कि कोड के कम लाइनों, बेहतर और अधिक सहज ज्ञान युक्त हैं, या बेहतर बैठता है के साथ आप तो आप कर सकते हैं या तो: -

  1. एक डीबी दृश्य बनाएँ और mutable="false" साथ दृश्य के लिए mapings फ़ाइलों को बनाने के अपनी कक्षा परिभाषा और अपने वर्ग के गुणों पर protected set; का उपयोग
  2. बजाय जैसे LINQ प्रदाता का उपयोग करें .Query ( इस blog post देखना अधिक जानकारी के लिए)
+0

LINQ प्रदाता बहुत बुनियादी कार्यों के लिए अच्छा है, फिर भी मैं वास्तविक LINQ प्रदाता द्वारा उत्पन्न एसक्यूएल के साथ प्रभावित नहीं कर रहा हूँ। – CrazyCoderz

+0

इस पर विचार के रूप में इसे स्वीकार करते हुए कि आपने पोस्ट किए गए कोड के साथ किसी भी भयानक समस्या को इंगित नहीं किया है और वास्तव में एक ही चीज़ को पूरा करने का एक और तरीका प्रदान किया है। धन्यवाद ... – CrazyCoderz

+0

मैं नहीं एसक्यूएल LINQ प्रदाता उत्पन्न करता है के साथ बहुत चिंतित हैं जब तक आप पाते हैं कि यह एक समस्या है और 'NHPRof' वास्तव में आपको बताती हैं कि आप एक समस्या है क्या करेंगे होगा। – Rippo

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