2012-03-21 7 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 –

答えて

30

ToString()は、Linq to Objectsでのみ使用できます。これは、あなたのユーザーテーブルからすべてのユーザーを返すために起こっている

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 =(from u from _usersRepository.Users where .... select new {u.FirstName 、u.LastName、u.UserID})。ToList()。(u =>新しいSelectListItem {Text = u.FirstName + "" + u.LastName、Value = u.UserID.ToString()}); ' –

+0

「FirstName」でDistinctを使用したい場合はどうすればよいですか? – 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 to Entitiesプロバイダは、 'SqlFunctions 'のメソッドを同等のSQLに解析することができます。したがって、より一般的なクエリと同じようにこのクエリを作成して実行することができます。 – Sorax

+0

お役立ち情報将来の参照のためにこの質問をブックマークしてください、明確化のおかげで! –