2011-12-13 2 views
10

私は自分のビューでドロップダウンを設定しようとしています。どんな助けでも大歓迎です。ありがとう。LINQ to Entitiesは、Entity Data Modelプリミティブ型のキャストのみサポートしていますか?

エラー:

Unable to cast the type 'System.Int32' to type 'System.Object'.

LINQ to Entities only supports casting Entity Data Model primitive types.

コントローラー:

ViewBag.category = (from c in new IntraEntities().CategoryItems 
        select new SelectListItem() {Text=c.Name, Value=""+c.ID }).ToList<SelectListItem>(); 

ビュー:

Category:<br />@Html.DropDownList("category", (List<SelectListItem>)ViewBag.category) 
+0

Linq to enititesはconvert.Tostring()とconvert.ToDatetime()のこれらのタイプの変換をサポートしていません。 –

答えて

19

これはどう:

と強く型付けされたビューモデルを使用すると、ViewBagの弱い型付きのクラップ(それは私がそれを呼び出す方法です)の代わりにどうですか?

public class CategoryViewModel 
{ 
    public string CategoryId { get; set; } 
    public IEnumerable<SelectListItem> Categories { get; set; } 
} 

その後:

あなたの強く型付けされたビューで
public ActionResult Foo() 
{ 
    var model = new CategoryViewModel 
    { 
     Categories = 
      from c in new IntraEntities().CategoryItems.ToList() 
      select new SelectListItem 
      { 
       Text = c.Name, 
       Value = c.ID.ToString() 
      } 
    }; 
    return View(model); 
} 

、最終的には:このように

@model CategoryViewModel 
@using (Html.BeginForm()) 
{ 
    @Html.DropDownListFor(x => x.CategoryId, Model.Categories) 
    <button type="submit">OK</button> 
} 

はるかに良い、あなたは思いませんか?

+9

@olivehour、いいえ、私はより多くの評判を必要としません。私はちょうど人々がViewBagのこのひどい使い方をやめ、ASP.NET MVCアプリケーションでビューモデルを使い始めるのを見たいと思っています。もう一度 –

+0

+1してください。私はこれをやっているバンガロールの開発者を持っています。私は、このページへのリンクを与えて、ビューモデルがどのように選択リストをモデル化すべきかを示します。 – danludwig

+3

@olivehour、いいえ、そのページにリンクを張ってはいけません。私は、このWebページの例が実際のアプリケーションで行うべきこととはまったく離れていることを意味します。私は、この例では、OPがLINQ-to-Entitiesをハードコーディングしていることを意味しています。抽象化を使わずにコントローラで直接DALと呼んでいて、単体で単体テストを行うことは全く不可能です。コントローラは、EFなどの特定のデータアクセステクノロジに強く結びついてはいけません。抽象化を使用して、アプリケーションのさまざまなレイヤー間の結合を弱める必要があります。 –

0
ViewBag.category = (from c in new IntraEntities().CategoryItems 
        select new SelectListItem {Text=c.Name, Value=c.ID.ToString()}) 
.ToList<SelectListItem>(); 
+0

動作しませんでしたが、ありがたいです。 "LINQ to Entitiesは、メソッド 'System.String ToString()'メソッドを認識せず、このメソッドをストア式に変換することはできません。 – Ber53rker

+0

申し訳ありませんが、Darinはもう一度正しいです。クエリを実行するには、.ToList()を呼び出す必要があります。次に、LINQ to Objectsは.ToString()呼び出しを認識します。 – danludwig

4

変換の前に.AsEnumerable()にキャストをキャストして、キャストのためにオブジェクトにLinqを使用させることができますが、System.Data.Objects.SqlClientで使用可能なSQL互換関数を使用することをお勧めします。 SqlFunctions so:

(from c in new IntraEntities().CategoryItems 
select new SelectListItem() { 
    Text = c.Name, 
    Value = SqlFunctions.StringConvert((double)c.ID).TrimStart() 
}) 
+4

これは私にとってより受け入れられる答えです。受け入れられた答えは、コレクション上でToList()を呼び出すだけです。おそらく必要ではありません。その後、それはトラックから外れて、ビューモデルクラスの使用について講義します。 – Sergio

0

エラーは、文字列を整数値で連結しようとしています。 linqクエリでは不可能です。文字列に変換int型の場合 あなたはこのように変換するためのSQL関数を使用することができます

SqlFunctions.StringConvert((decimal?)intProperty) 
0

を使用することができます。

ViewBag.category = (from c in new IntraEntities().CategoryItems 
        select new SelectListItem() { 
Text=c.Name, 
Value=SqlFunctions.StringConvert((double) c.ID) }).ToList<SelectListItem>(); 

しかし、あなたのファイルの先頭にこの名前空間を含めることを忘れないでください:

System.Data.Objects.SqlClientを使用しています。

0

はい、Nalan Mが提案したように、「整数値の文字列を連結することは可能ですが、linqクエリでは不可能です。取得しようとしているデータベースの列であることを確認してください。私のためにはそれは何だったのですか。間違った列を指定していました。クラスを呼び出すときは、誰かがそのクラスのクラスを作成したようです。ビジュアルスタジオで作業している場合、データベースをチェックして、呼び出していることを確認できます。そうすれば、「私が欲しいコラムはどこですか?」という質問に答えることができます。データベースに格納されます。

関連する問題