2010-09-21 12 views
6

मेरे पास लिंक से एंटिटी विधियों का एक गुच्छा है, जिसमें एक ही चयन कथन था, इसलिए मैंने सोचा कि मैं चालाक हो जाऊंगा और इसे अनावश्यकता को कम करने के लिए अपनी विधि में अलग कर दूंगा ... लेकिन जब मैंने कोड चलाने का प्रयास किया, तो मुझे मिला निम्न त्रुटि ...लिंक त्रुटि का कारण क्या है: इस विधि को स्टोर अभिव्यक्ति में अनुवादित नहीं किया जा सकता है?

this method cannot be translated into a store expression

यहाँ विधि मैं बनाया ...

public User GetUser(DbUser user, long uid) 
{ 
    return new User 
    { 
     Uid = user.uid, 
     FirstName = user.first_name, 
     LastName = user.last_name 
    }; 
} 

है और इस तरह की एक विधि में बोल रहा हूँ ...

public User GetUser(long uid) 
{ 
    using (var entities = new myEntities()) { 
     return 
      entities.DbUsers.Where(x => x.uid == uid && x.account_status == (short)AccountStatus.Active). 
       Select(x => GetUser(x, uid)).FirstOrDefault(); 
    } 
} 

अद्यतन: यहाँ कोड है कि इनलाइन काम करता है

public User GetUser(long uid, long uid_user) 
     { 
      using (var entities = new myEntities()) 
      { 

       var q = from u in entities.DbUsers 
         where u.uid == uid_user 
         select new User 
         { 
          Uid = u.uid, 
          FirstName = u.first_name, 
          LastName = u.last_name, 
          BigPicUrl = u.pic_big, 
          Birthday = u.birthday, 
          SmallPicUrl = u.pic_small, 
          SquarePicUrl = u.pic_square, 
          Locale = u.locale.Trim(), 
          IsFavorite = u.FavoriteFriends1.Any(x => x.uid == uid), 
          FavoriteFriendCount = u.FavoriteFriends.Count, 
          LastWishlistUpdate = u.WishListItems.OrderByDescending(x => x.added).FirstOrDefault().added, 
          Sex = (UserSex)u.sex 
         }; 

       var user = q.FirstOrDefault(); 
       user.DaysUntilBirthday = user.Birthday.DaysUntilBirthday(); 
       return user; 
      } 
     } 

उत्तर

0

आप ऐसा नहीं कर सकते क्योंकि getUser विधि किसी भी TSQL बयान में परिवर्तित नहीं किया जा सकता है। अगर आप अपने DBUser पहले लौटने और फिर GetUser विधि के पहले पैरामीटर के रूप में इसका इस्तेमाल करते हैं तो आप निष्पादित करने के लिए और एक बार आप आप DBUser आप इसे GetUser

को पारित कर सकते हैं मजबूर कर रहे हैं हो सकता है कि आप इस कोशिश कर सकते हैं:

public User GetUser(long uid) 
{ 
    using (var entities = new myEntities()) 
    { 
     return GetUser(
      entities.DbUsers 
       .Where(x => x.uid == uid && x.account_status == (short)AccountStatus.Active) 
       .FirstOrDefault(), 
      uid); 
    } 
} 

संपादित

आप कह रहे हैं के बाद से यह अभी भी विफल रहता है यह enum की वजह से हो सकता है ??

public User GetUser(long uid) 
{ 
    using (var entities = new myEntities()) 
    { 
     short status = (short)AccountStatus.Active; 
     return GetUser(
      entities.DbUsers 
       .Where(x => x.uid == uid && x.account_status == status) 
       .FirstOrDefault(), 
      uid); 
    } 
} 
+0

मैंने इस तकनीक की कोशिश की और यह अभी भी –

+0

विफल रहता है क्यों आपके पास डीबीयूसर और उपयोगकर्ता है? क्या ईएफ की संस्थाएं आपकी डोमेन इकाइयां नहीं हैं ??? ऐसा लगता है कि उपयोगकर्ता डीबीयूसर का एक संक्षिप्त संस्करण है क्यों न सिर्फ डीबीयूसर पर काम करता है? –

+0

मैं अनुमान लगाता हूं कि डीबीयूसर ईएफ पॉको है, और उपयोगकर्ता उसका कस्टम बिजनेस ऑब्जेक्ट है। फिर भी, मैं सीधे अपने कस्टम पोको में मानचित्रण करना पसंद करता हूं। मध्य आदमी को छोड़ दो। – RPM1984

9

त्रुटि स्पॉट पर है, आप इसे टी-एसक्यूएल (या पी-एसक्यूएल) क्वेरी में अनुवाद नहीं कर सकते हैं।

आपको यह सुनिश्चित करने की आवश्यकता है कि आपने इसे किसी अन्य प्रकार में हाइड्रेट करने का प्रयास करने से पहले क्वेरी निष्पादित की है।

इसे सरल रखें, एक विस्तार विधि का उपयोग करें। यही वह है जिसके लिए वे हैं।

public static User ToUserEntity(this DbUser user) 
{ 
    return new User 
    { 
     Uid = user.uid, 
     FirstName = user.first_name, 
     LastName = user.last_name 
    }; 
} 

फिर अपने दाल में:

public User GetUser(long uid) 
{ 
    User dbUser; 

    using (var entities = new myEntities()) 
    { 
     dbUser = entities.DbUsers 
        .Where(x => x.uid == uid && x.account_status == (short)AccountStatus.Active) 
       .FirstOrDefault(); // query executed against DB 
    } 

    return dbUser.ToUserEntity(); 
} 

देखें कैसे मैं एक वस्तु के बाद संदर्भ निपटारा कर दिया गया है में POCO हाइड्रेट? इस तरह, आप सुनिश्चित करते हैं कि कस्टम ऑब्जेक्ट में हाइड्रेट करने का प्रयास करने से पहले ईएफ ने इसका अभिव्यक्ति कार्य पूरा कर लिया है।

इसके अलावा मुझे नहीं पता कि आप उस विधि के लिए क्यों गुजर रहे हैं, इसका उपयोग भी नहीं किया जा रहा है।

एक और नोट पर, आपको की आवश्यकता नहीं है ताकि इस तरह की चीज (प्रोजेक्ट ईएफ पॉको आपकी ऑब्जेक्ट्स में) हो।

यदि आप करते हैं, तो यह कस्टम पीओसीओ के लिए एक अच्छा मामला है (टेबल को सीधे अपने कस्टम पॉको में मैप करें, कोड जनरेशन का उपयोग न करें)।

+0

अच्छी तरह से, मैं उस क्वेरी के एक हिस्से में यूआईडी का उपयोग करता हूं जो यहां नहीं दिखा रहा है (जिसने त्रुटि को प्रभावित नहीं किया)। जब मेरे पास यह स्टेटस इनलाइन थी, तो यह ठीक काम करता था। लेकिन जब मैं विफल रहता हूं तो कोड को अपनी विधि में ले जाता हूं। संकलक क्यों नहीं कह सकता कि यह अभिव्यक्ति ईएफ कथन में है। मुझे पता है कि मैं इस ऑब्जेक्ट को बाद में हाइड्रेट कर सकता हूं, लेकिन मेरे पास कई फ़ील्ड हैं जिन्हें डीबी संदर्भ पर काम करने की आवश्यकता है। वे इनलाइन पर बार-बार दोहराए जाते हैं (और उन्होंने ठीक काम किया)। मैं वास्तव में समझ में नहीं आता कि आप इस कार्यक्षमता को अपनी ओडब्ल्यूएन विधि में क्यों नहीं निकाल सकते हैं। –

+0

@wcpro - क्या आप कोड दिखा सकते हैं जहां यह इनलाइन काम करता है? मुझे यह देखने में बहुत दिलचस्पी होगी कि क्वेरी अभिव्यक्ति बनाने के लिए एंटिटी फ्रेमवर्क उपयोगकर्ता (एक यादृच्छिक सीएलआर ऑब्जेक्ट) और डीबीयूसर (एक ईएफ ऑब्जेक्ट) के बीच संबंधों को "अनुमान" कैसे प्रबंधित करता है। – RPM1984

+0

वैसे भी, क्या आपने मेरा जवाब आजमाया - इसे काम करना चाहिए (जब तक आपको कार्लोस नीचे नहीं कहता है, तब तक आपको कोई समस्या नहीं है) – RPM1984

3

यह अभिव्यक्ति वांछित परिणाम देने के लिए काम करेगी (कुछ हद तक) मैंने अभी भी यह पता लगाया है कि teh select statement में अतिरिक्त चर में कैसे पास किया जाए ...

..... .Select(GetUser).FirstOrDefault()   

static readonly Expression<Func<DbUser, User>> GetUser = (g) => new User { 
      Uid = g.uid, 
      FirstName = g.first_name, 
      LastName = g.last_name, 
      BigPicUrl = g.pic_big, 
      Birthday = g.birthday, 
      SmallPicUrl = g.pic_small, 
      SquarePicUrl = g.pic_square, 
      Locale = g.locale.Trim(), 
      //IsFavorite = g.FavoriteFriends1.Any(x=>x.uid==uid), 
      FavoriteFriendCount = g.FavoriteFriends.Count, 
      LastWishlistUpdate = g.WishListItems.OrderByDescending(x=>x.added).FirstOrDefault().added 
     }; 
+0

मुझे वास्तव में यह कारण पसंद है कि आप इसे linq क्वेरी के अंदर उपयोग करने से पहले इसका उपयोग कर सकते हैं, इसलिए यह सूचियों के साथ काम करता है। – tkerwood

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

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