2012-03-21 10 views
15

Próbuję wyświetlić listę rozwijaną użytkowników w moim widoku. Oto kod używam w mojej metody kontrolera:Tworzenie kolekcji SelectListItem z LINQ

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

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

otrzymuję błąd podczas próby konwersji UserID do łańcucha:

LINQ do podmiotów nie rozpoznaje „Metoda System. Metoda String ToString(), a tej metody nie można przetłumaczyć na wyrażenie składowania.

Jak utworzyć kolekcję SelectListItem z moich jednostek?

+0

spojrzeć na to: http://stackoverflow.com/questions/5899683/linq-to-entities-does-not-recognize -the-method-system-string-tostring-method –

Odpowiedz

30

ToString() może być używany tylko w Linq do Objects. Prostym rozwiązaniem jest wstawienie .ToList() następująco:

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

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

To będzie powrót do wszystkich użytkowników z tabeli użytkownika. Jeśli możesz zmniejszyć liczbę użytkowników uzyskanych z bazy danych, twoje zapytanie będzie bardziej efektywne, np.

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

jeśli nie chcesz otrzymywać wszystkich kolumn, możesz również użyć: 'var users = (zu w _usersRepository.Users gdzie .... select new {u.FirstName , u.LastName, u.UserID}) ToList(). Wybierz (u => nowy SelectListItem {Text = u.FirstName + "" + u.LastName, Value = u.UserID.ToString()}); ' –

+0

Co, jeśli chcemy, aby wyróżniał się "FirstName"? – Halter

9

myślę szukasz 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

Czy zachowa to odroczoną realizację zapytania? Bo jeśli tak (szczerze mówiąc, nie wiem z góry), to może być lepsza opcja, jeśli to jest ważne. –

+1

Odroczone wykonanie zostaje zachowane. LINQ to dostawcy Entity mogą analizować metody 'SqlFunctions' w ich równoważnym SQL. Dzięki temu możesz skomponować i wykonać to zapytanie tak samo jak bardziej typowe zapytanie. – Sorax

+0

Dobrze wiedzieć! Zakładając to pytanie w przyszłości, dziękuję za wyjaśnienie! –

Powiązane problemy