2015-01-21 1 views
1

Я новичок в MVC, и пытаюсь построить студент маркирует систему,модель элемент передается в словарь «System.Data.Entity.Infrastructure.DbQuery`, но требует» System.Collections.Generic.IEnumerable

класс модели выглядит следующим образом:

public partial class MarksType 
{ 
    public int MarksTypeId { get; set; } 
    public Nullable<int> English { get; set; } 
    public Nullable<int> Math { get; set; } 
    public Nullable<int> Physics { get; set; } 
    public Nullable<int> Chemistry { get; set; } 
    public Nullable<int> ComputerScience { get; set; } 
    public Nullable<int> MoralScience { get; set; } 
    public Nullable<int> TotalMarks { get; set; } 
    } 

мой контроллер выглядит следующим образом:

public class MarksController : Controller 
{ 
    MarksEntities marks = new MarksEntities(); 

public ActionResult MarksProfile() 
{ 
    List<MarksType> yourmarks = from x in marks.MarksType where x.MarksTypeId == 5 
         group x by 1 into y 
         select new MarksType 
         { 

          English = y.Sum(x => x.English), 
          Math = y.Sum(x => x.Math), 
          Physics = y.Sum(x => x.Physics), 
          Chemistry= y.Sum(x => x.Chemistry), 
          ComputerScience = y.Sum(x => x.ComputerScience), 
          MoralScience= y.Sum(x => x.MoralScience), 

          TotalMarks = y.Sum(x => x.English) + y.Sum(x => x.Math) 
          + y.Sum(x => x.Physics) + y.Sum(x => x. Chemistry) 
          +y.Sum(x => x.ComputerScience) + y.Sum(x => x.MoralScience) 
         }).ToList(); 



     return View(yourmarks); 
    } 
} 

Наконец мой взгляд выглядит следующим образом:

@model IEnumerable<MvcMarks.Models.MarksType> 

<p> 
@Html.ActionLink("Create New", "Create") 
</p> 
<table> 
<tr> 
    <th> 
     @Html.DisplayNameFor(model => model. MarksTypeId) 
    </th> 
    <th> 
     @Html.DisplayNameFor(model => model.English) 
    </th> 
    <th> 
     @Html.DisplayNameFor(model => model.Math) 
    </th> 
    <th> 
     @Html.DisplayNameFor(model => model.Physics) 
    </th> 
    <th> 
     @Html.DisplayNameFor(model => model.Chemistry) 
    </th> 
    <th> 
     @Html.DisplayNameFor(model => model.ComputerScience) 
    </th> 
    <th> 
     @Html.DisplayNameFor(model => model.MoralScience) 
    </th> 
    <th></th> 
</tr> 

@foreach (var item in Model) { 
<tr> 
    <td> 
     @Html.DisplayFor(modelItem => item.MarksTypeId) 
    </td> 
    <td> 
     @Html.DisplayFor(modelItem => item.English) 
    </td> 
    <td> 
     @Html.DisplayFor(modelItem => item.Math) 
    </td> 
    <td> 
     @Html.DisplayFor(modelItem => item.Physics) 
    </td> 
    <td> 
     @Html.DisplayFor(modelItem => item.Chemistry) 
    </td> 
    <td> 
     @Html.DisplayFor(modelItem => item.ComputerScience) 
    </td> 
    <td> 
     @Html.DisplayFor(modelItem => item.MoralScience) 
    </td> 

    </tr> 
    } 

    </table> 

я получаю эту ошибку:

The model item passed into the dictionary is of type 'System.Data.Entity.Infrastructure.DbQuery 1[<>f__AnonymousType2 1[System.Nu>llable 1[System.Int32]]]',but this dictionary requires a model item of type 'System.Collections.Generic.IEnumerable 1[MvcMarks.Models.MarksType]'.

я создал View, щелкнув правой кнопкой мыши на MarksProfile метод действий и проверил сильно типизированных вид с MarksType модели выбран, выбранный шаблон эшафот в список, и, наконец, проверил создать как частичный вид

может я знаю, что я делаю неправильно

Любая помощь будет большим.

+0

Ваш запрос возвращает коллекцию анонимных объектов ('select new {..}) ' –

ответ

1

Как говорится исключения, ваш код ожидает другого типа в модели, чем вы предоставили:

@model IEnumerable<MvcMarks.Models.MarksType> 

Проверьте yourmarks объекта, а также изменить вид соответственно. Как я вижу, вы создаете запрос с общими метками, а не с объектами MarksType, и из-за этого ваш код не работает.

И зачем вам нужно TotalMarks? Вы не используете его в своем представлении.

+0

@ VMAtm, я пытаюсь показать TotalMarks для конкретного ученика в представлении – stom

+2

Рассмотрите ответ @RahulSingh - я думаю, он предоставил правильный путь для решения вашей проблемы. – VMAtm

2

Вы пропускание anonymous type на ваш взгляд, но он ожидает IEnumerable of MarksType, что-то вроде этого: -

List<MarksType> yourmarks = (from x in marks.MarksType where x.MarksTypeId == 5 
         group x by 1 into y 
         select new MarksType 
         {  
          MarksTypeId = .. , 
          English = ..  
          TotalMarks = y.Sum(x => x.English) +y.Sum(x => x.Math) 
          + y.Sum(x => x.Physics) + y.Sum(x => x. Chemistry) 
          +y.Sum(x => x.ComputerScience) + y.Sum(x => x.MoralScience) 
         }).ToList(); 

Но, так как ваша модель MarksTypeId не содержит определение MarksType, вы должны добавить это свойство для вашей модели: -

public partial class MarksType 
{ 
    //other properties 
    public decimal TotalMarks {get; set; } 
} 
+0

OP's View не ожидает, что 'TotalMarks' – VMAtm

+0

@VMAtm - Да, это была опечатка, благодаря чему она была исправлена. –

+0

@Rahul, привет, моя модель сгенерирована автоматически с использованием DB First Method, поэтому я могу внести изменения в класс Model или SQL Sever Express? – stom

0

Создать новый вид модели и использовать его вместо MarksType

public partial class MarksTypeViewModel 
{ 
    public Nullable<int> English { get; set; } 
    public Nullable<int> Math { get; set; } 
    public Nullable<int> Physics { get; set; } 
    public Nullable<int> Chemistry { get; set; } 
    public Nullable<int> ComputerScience { get; set; } 
    public Nullable<int> MoralScience { get; set; } 
    public Nullable<int> TotalMarks { get; set; } 
} 

Убедитесь, что я еще не добавил MarksTypeID в этой модели. Вы должны избегать ненужных полей, которые не используются в вашем представлении. например CreateDate, UpdateDate и т.д.

Теперь вы можете использовать этот вид модели в вашем Linq заявление вместо MarksType

List<MarksTypeViewModel> yourmarks = from x in marks.MarksType where x.MarksTypeId == 5 
        group x by 1 into y 
        select new MarksTypeViewModel 
        { 
         English = y.Sum(x => x.English), 
         Math = y.Sum(x => x.Math), 
         Physics = y.Sum(x => x.Physics), 
         Chemistry= y.Sum(x => x.Chemistry), 
         ComputerScience = y.Sum(x => x.ComputerScience), 
         MoralScience= y.Sum(x => x.MoralScience), 

         TotalMarks = y.Sum(x => x.English) + y.Sum(x => x.Math) 
         + y.Sum(x => x.Physics) + y.Sum(x => x. Chemistry) 
         +y.Sum(x => x.ComputerScience) + y.Sum(x => x.MoralScience) 
        }).ToList(); 

и изменить модель связывания на странице просмотра с новым ViewModel. Его называют MVVM patern.

@model IEnumerable<MvcMarks.Models.MarksTypeViewModel> 
<p> 
@Html.ActionLink("Create New", "Create") 
</p> 
<table> 
Смежные вопросы

 Смежные вопросы