2012-03-21 86 views
15

我試圖在我的視圖中顯示用戶的下拉列表。下面是我用在我的控制器方法的代碼:使用LINQ創建SelectListItem的集合

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

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

我得到一個錯誤試圖UserID轉換爲字符串:

LINQ到實體無法識別方法「系統。 String ToString()'方法,並且此方法不能轉換爲存儲表達式。

如何從我的實體創建一個SelectListItem的集合?

+0

看看這個:http://stackoverflow.com/questions/5899683/linq-to-entities-does-not-recognize -the-method-system-string-tostring-method – 2012-03-21 20:14:45

回答

30

ToString()只能用於Linq to Objects。一個簡單的辦法是插入.ToList()如下:

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

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

這將會從您的用戶表中返回的所有用戶。如果你可以減少從數據庫中獲得的用戶數量,你的查詢將會更有效率,例如,

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,其中.... select new {u.FirstName ,u.LastName,u.UserID})。ToList()。Select(u => new SelectListItem {Text = u.FirstName +「」+ u.LastName,Value = u.UserID.ToString()});' – 2013-12-12 10:12:51

+0

如果我們想讓它與「FirstName」區分呢? – Halter 2017-05-18 15:31:26

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

這是否會保留延遲執行的查詢,但?因爲如果是這樣(我真的不知道我的頭頂),如果這很重要,這可能是一個更好的選擇。 – 2012-03-21 22:48:40

+1

延遲執行被保留。 LINQ to Entities提供者能夠將'SqlFunctions'的方法解析爲其等效的SQL。因此,您可以像更典型的查詢一樣編寫和執行此查詢。 – Sorax 2012-03-22 13:29:40

+0

很高興知道!收藏此問題以供將來參考,謝謝澄清! – 2012-03-22 17:17:21