LINQ

2012-03-21 11 views
15

के साथ SelectListItem का संग्रह बनाना मैं अपने दृश्य में उपयोगकर्ताओं की एक ड्रॉपडाउन सूची प्रदर्शित करने का प्रयास कर रहा हूं।LINQ

संस्थाओं को LINQ विधि 'सिस्टम को नहीं पहचानता है:

var users = _usersRepository.Users.Select(u => new SelectListItem 
            { 
             Text = u.FirstName + " " + u.LastName, 
             Value = u.UserID.ToString() 
            } 

return View(new MyViewModel { Users = users }); 

मैं एक त्रुटि एक स्ट्रिंग के लिए UserID कन्वर्ट करने के लिए कोशिश कर पाने: यहाँ कोड मैं अपने नियंत्रक विधि में उपयोग कर रहा हूँ है। स्ट्रिंग ToString() 'विधि, और इस विधि का अनुवाद एक अभिव्यक्ति अभिव्यक्ति में नहीं किया जा सकता है।

मैं अपनी संस्थाओं से SelectListItem का संग्रह कैसे बना सकता हूं?

+0

देख रहे हैं: http://stackoverflow.com/questions/5899683/linq-to-entities-does-not-recognize -the-method-system-string-tostring-method –

उत्तर

30

ToString() केवल लिंक से ऑब्जेक्ट्स में उपयोग किया जा सकता है।

var users = _usersRepository.Users.ToList().Select(u => new SelectListItem 
            { 
             Text = u.FirstName + " " + u.LastName, 
             Value = u.UserID.ToString() 
            }); 

return View(new MyViewModel { Users = users }); 

यह सभी उपयोगकर्ताओं के अपने प्रयोक्ता मेज से वापस जाने के लिए जा रहा है: एक सरल समाधान के रूप में इस .ToList() डालने के लिए है। यदि आप डेटाबेस से प्राप्त उपयोगकर्ताओं की मात्रा को कम कर सकते हैं तो आपकी क्वेरी अधिक कुशल होगी, उदा।

var users = _usersRepository.Users.Where(u => ....).ToList().Select(u => new SelectListItem 
            { 
             Text = u.FirstName + " " + u.LastName, 
             Value = u.UserID.ToString() 
            }); 

return View(new MyViewModel { Users = users }); 
+1

यदि आप सभी कॉलम प्राप्त नहीं करना चाहते हैं तो आप भी इसका उपयोग कर सकते हैं: 'var users = (आप में से _usersRepository.Users जहां .... नया चुनें {u.FirstName , u.LastName, u.UserID})। ToList()। चुनें (u => नया selectListItem {टेक्स्ट = u.FirstName + "" + u.LastName, Value = u.UserID.ToString()}); ' –

+0

क्या होगा यदि हम इसे 'फर्स्टनाम' द्वारा अलग करना चाहते हैं? – Halter

9

मुझे लगता है कि आप इस पर एक नज़र के लिए SqlFunctions

using System.Data.Objects.SqlClient; 

var users = _usersRepository.Users.Select(u => new SelectListItem 
            { 
             Text = u.FirstName + " " + u.LastName, 
             Value = SqlFunctions.StringConvert((double?)u.UserID) 
            } 

return View(new MyViewModel { Users = users }); 
+0

क्या यह क्वेरी के स्थगित निष्पादन को संरक्षित रखेगा, हालांकि? क्योंकि यदि ऐसा है (मैं ईमानदारी से मेरे सिर के ऊपर से नहीं जानता), यह महत्वपूर्ण विकल्प हो सकता है यदि यह महत्वपूर्ण है। –

+1

स्थगित निष्पादन संरक्षित है। LINQ से संस्था प्रदाता 'एसक्यूएलफंक्शन' के तरीकों को उनके समकक्ष एसक्यूएल में पार्स करने में सक्षम हैं। तो आप इस क्वेरी को एक और अधिक सामान्य क्वेरी के रूप में लिखने और निष्पादित करने में सक्षम हैं। – Sorax

+0

जानना अच्छा है! भावी संदर्भ के लिए इस प्रश्न को बुकमार्क करना, स्पष्टीकरण के लिए धन्यवाद! –

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