2011-07-12 16 views
2

私はこのエラーを取得しています:asp.net MVC 3レイザー/ LINQの

辞書に渡されるモデルアイテムはタイプSystem.Data.Entity.Infrastructure.DbQuery``1[<>f__AnonymousType1``2[System.DateTime,System.Int32]]のですが、この辞書はタイプSystem.Collections.Generic.IEnumerable``1[AtAClick.Models.WhatsOn]のモデルアイテムが必要です。

これは私のコントローラです。

public ViewResult Index(WhatsOn model) 
{  
    DateTime myDate = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day); 

    var datequery = 
      db.WhatsOns.Where(c => c.start > myDate).OrderByDescending(c => c.start).GroupBy(c => c.start).Select(
       sGroup => new 
           { 
            day = sGroup.Key, 
            whtscount = sGroup.Count() 
           }); 

    return View(datequery); 
} 

今日の日付とエントリ数を返したいと思います。私はこれに新しいです、どんな助けも大いに感謝しています!ありがとうございました。mjoreの詳細が必要な場合は、私に知らせてください。ありがとう!

これは=私の見解

==============================

@model IEnumerable<AtAClick.Models.WhatsOn> 

@{ ViewBag.Title = "Index"; } 

<h2>Index</h2> 

<p>@Html.ActionLink("Create New", "Create")</p> 
<table> 
    <tr> 
     <th>start</th> 
     <th>end</th> 
     <th>Name</th> 
     <th>Desc</th> 
     <th>link</th> 
     <th>CalenderDisplay</th> 
     <th></th> 
    </tr> 

@foreach (var item in Model) { 
    <tr> 
     <td>@Html.DisplayFor(modelItem => item.day)</td> 
     <td>@Html.DisplayFor(modelItem => item.whtscount)</td>   
     <td> 
      @Html.ActionLink("Edit", "Edit", new { id=item.ID }) | 
      @Html.ActionLink("Details", "Details", new { id=item.ID }) | 
      @Html.ActionLink("Delete", "Delete", new { id=item.ID }) 
     </td> 
    </tr> 
} 

です=======================================================

これは私のコントローラの編集方法です。

// // GET:/ whatsonが/編集/ 5

public ActionResult Edit(int id) 
    { 
     WhatsOn whatson = db.WhatsOns.Find(id); 
     return View(whatson); 
    } 

    // 
    // POST: /WhatsOn/Edit/5 

    [HttpPost] 
    public ActionResult Edit(WhatsOn whatson) 
    { 
     if (ModelState.IsValid) 
     { 
      db.Entry(whatson).State = EntityState.Modified; 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 
     return View(whatson); 
    } 
+0

あなたの投稿を編集し、あなたのビューのコードを含めることができますか? – Jon

+0

ねえ、今すぐポップアップします...完了しました。エディタはテーブルタグを取り出しました。それは実際には少し磨かれていますが、foreachがそこにあります。 – Dan

答えて

0

私はこの問題は、どのようなビューが期待して何をあなたのコントローラーが通過している間に不一致だと思います。あなたのSELECT文で

新しい匿名型を選択するが、あなたのビューはフィールド上で昼とwhtscountですいただきました後、

var datequery = 
     db.WhatsOns.Where(c => c.start > myDate).OrderByDescending(c => c.start).GroupBy(c => c.start).Select(
      sGroup => new WhatsOn() 
          { 
           day = sGroup.Key, 
           whtscount = sGroup.Count() 
          }); 

アップデートでdatequeryを置き換えると仮定タイプIEnumerable<WhatsOn>

を期待しています。 エラーは、選択したクエリをequivilent SQLに変換できないことを示しています。お試しできるものは

に変更しています。

更新:私は編集の投稿メソッドにアクセスすると、WhatsOnオブジェクトがデータベースから元々読み込まれたWhatsOnに関連付けられていないことが考えられます。

public ActionResult Edit(int id) 
{ 
    WhatsOn whatson = db.WhatsOns.Find(id); 
    return View(whatson); 
} 

[HttpPost] 
public ActionResult Edit(int id, FormCollection collection) 
{ 
    WhatsOn whatsOnmodel = db.WhatsOns.Find(id); 

    if (TryUpdateModel(whatsOnmodel)) 
    { 
     db.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 
    return View(whatsOnmodel); 
} 

更新:そのアプローチは、あなたがそれをテストすることができ、あなたの1だけで

[HttpPost] 
public ActionResult Edit(int id, WhatsOn whatson) 
{ 
    WhatsOn whatsOnmodel = db.WhatsOns.Find(id); 

    if (ModelState.IsValid) 
    { 
     whatsOnmodel.day = whatson.day; 
     whatsOnmodel.whtscount = whatson.whtscount; 
     db.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 
    return View(whatsOnmodel); 
} 

ので、最初にロードを追加しなかった場合、あなたが見ることが働いていなかった場合そして何が起こるか見

更新: 実際に私はあなたの最初のアプローチは働いていたのだと思いますが、私はあなたが作る場合、それは何が起こるかIDが必要と考えること

[HttpPost] 
public ActionResult Edit(int id, WhatsOn whatson) 
{ 
    if (ModelState.IsValid) 
    { 
     db.Entry(whatson).State = EntityState.Modified; 
     db.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 
    return View(whatson); 
} 
+0

返信いただきありがとうございます、私はもう少し、私はこのエラーが表示されます...エンティティまたは複合型 'AtAClick.Models.WhatsOn' LINQ to Entitiesクエリで構築することはできません。このクエリを処理するために、ビュー内のforeachを編集する必要がありますか?再度、感謝します! – Dan

+0

これはDTOを使わなくても機能しました。それは日付でそれらをグループ化し、カウントを返す!しかし、私がこのエラーを取得しようとすると、私はエラーの後で私を助けていないことを自由に感じて、私はエラーの後にエラーを知って..とにかく、ストアの更新、挿入、または削除ステートメントは、 )。エンティティはロードされた後に変更または削除された可能性があります。 ObjectStateManagerのエントリをリフレッシュする...アドバイスはありますか?私はあなたの答えをどちらかの正しい方法でマークします! – Dan

+0

@Danあなたはあなたのコントローラのポストメソッドを投稿して、レコードを更新しようと思います – Manatherin

0

あなたのビューがIEnumerable<AtAClick.Models.WhatsOn>を期待して、しかし、あなたは匿名型のコレクションを渡しています。代わりにWhatsOnタイプのインスタンスをインスタンス化するために投影(Select)を変更する必要があります。

更新

あなたがwhatsonが、エンティティタイプであるとして、(例えばWhatsOnDto)上に投影するタイプの新しいデータ転送オブジェクト(DTO)を作成する必要があります。詳細は、The entity cannot be constructed in a LINQ to Entities queryを参照してください。ビューのモデルタイプをIEnumerable<WhatsOnDto>に更新するか、より良い方法としてMyViewModelタイプにWhatsOnDtosのプロパティを追加します。

+0

ありがとう、私はそれがマナチェーンが提案したものだと思います。私は彼のsoloutionを実装しましたが、私はちょうど彼の答えの下のコメントに投稿したエラーを得ました。どんな助けもありがとうございます。ありがとう! – Dan

+0

私は自分の答えを更新しました – devdigital

+0

私は今これを試してみて、もう一度お返事ありがとう、本当にありがとう! 2分! – Dan