2016-05-06 2 views
0

Я новичок в C#, MVC, LINQ, Entity Framework и обо всем остальном, что я делаю. Я выбрал stackoverflow brain-trust и другие сайты по этой проблеме и не вижу, как его решить.LINQ Repository & method return

Я пытаюсь реализовать шаблон репозитория для нового приложения, которое мы создаем, и проблемы с возвратом результатов запроса. Первой и самой насущной проблемой является то, что я получаю сообщение об ошибке ниже, а второе - вопрос о том, как обрабатывать пустые результаты запроса.

Для этой проблемы я пытаюсь получить список запросов из базы данных, которая будет представлена ​​в представлении панели. У нас есть рабочий прототип, который использует SQL-запросы, и я пытаюсь заменить его репозиториями, которые могут быть чрезмерными, но мы чувствуем, что хотим это сделать.

Вот вид:

@using RAM.DAL.Models 
@model RequestViewModel 
@{ 
    ViewBag.Title = "Dashboard"; 
} 

<h1>Dashboard</h1> 

<div class="col-md-4"> 
    <h2>Resource Requests</h2> 
     <div class="panel"> 
      <table class="table table-hover"> 
       <thead> 
        <tr class="bg-primary"> 
         <th>Number</th> 
         <th>Mission Title</th> 
         <th>Resource Requested</th> 
         <th>Person</th> 
        </tr> 
       </thead> 
       <tbody> 
        @if (Model.isEmpty) 
        { 
         <tr> 
          <td colspan="4">No requests pending</td> 
         </tr> 
        } 
        else 
        { 
         <tr onclick="location.href= '@Url.Action("Assignment", "Mission", new { id = Model.ID })'"> 
          <td>@Model.ID</td> 
          <td>@Model.title</td> 
          <td>@Model.resourceTitle</td> 
          <td>@Model.userName</td> 
         </tr> 
        } 
       </tbody> 
      </table> 
    </div> 
    <!--<p><a class="btn btn-default" href="#">Content 1 Btn &raquo;</a></p>--> 
</div> 

Вот ViewModel:

using System; 

namespace RAM.DAL.Models 
{ 
    public class RequestViewModel 
    { 
     public int? ID { get; set; } 
     public string title { get; set; } 
     public string requestText { get; set; } 
     public string user_ID { get; set; } //The userID of the user being requested. 
     public string userName { get; set; } //Full name of the user being requested 
     public int? fromResourceID { get; set; } //The resource where the request was generated from 
     public int? toResourceID { get; set; } //The resource where the reassigned worker is requested to go to 
     public string resourceTitle { get; set; } //Title of the resource where the reassigned worker is requested to go to 
     public DateTime? requestDate { get; set; }//The date the request was made 
     public bool? isEmpty { get; set; } 
    } 
} 

А вот хранилище до метода GetRequests у меня возникают проблемы с (остальные не реализован еще):

using RAM.DAL.Models; 
using System; 
using System.Linq; 
using System.Data; 
using System.Collections.Generic; 

namespace RAM.DAL 
{ 
    public class RequestRepository : IRequestRepository<RequestViewModel> 
    { 

     private RAMcontext context; 

     public RequestRepository(RAMcontext context) 
     { 
      this.context = context; 
     } 

     public IEnumerable<RequestViewModel> GetRequests() 
     { 
      var requests = from r in context.RAM_Requests 
        join u in context.Users on r.user_ID equals u.User_ID 
        join res in context.RAM_Resources on r.toResourceID equals res.ID 
        where r.resolved == false 
        select new RequestViewModel() 
        { 
         title = r.title, 
         ID = r.ID, 
         fromResourceID = r.fromResourceID, 
         toResourceID = r.toResourceID, 
         user_ID = r.user_ID, 
         userName = u.First_Name + " " + u.Last_Name, 
         resourceTitle = res.title, 
         requestText = r.requestText, 
         requestDate = r.requestDate 
        }; 
      /* } 
       catch 
       { 

       RequestViewModel empty = new RequestViewModel 
        { 
         isEmpty = true 
        }; 
       return empty; 
       }*/ 
      return requests.ToList().AsEnumerable(); 
     } 

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

Модели элемент передается в словарь типа 'System.Collections.Generic.List`1 [RAM.DAL.Models.RequestViewModel], но этот словарь требует модель элемента типа «RAM .DAL.Models.RequestViewModel.

ответ

0

Из сообщения об ошибке, я думаю, ваш метод действия отправляет коллекцию RequestViewModel в представление. Но ваше представление строго типизировано для одного экземпляра RequestViewModel, а не для коллекции. Именно по этой причине вы получаете эту ошибку.

Поскольку вы хотите показать коллекцию запросов, вы должны изменить представление, которое будет строго типизировано в коллекции. Вы можете использовать метод LINQ Any(), чтобы определить, есть ли у вас несколько элементов в коллекции, переданных в представление, и показать/скрыть сообщение/таблицу для отображения данных.

@model IEnumerable<RequestViewModel> 
<h1>Dashboard</h1> 
@if(!Model.Any()) 
{ 
    <p>No records found </p> 
} 
else 
{ 
    <table> 
    <tr> 
     <th>Title</th> 
     <th>User name </th> 
    </tr> 
    @foreach(var req in Model) 
    { 
    <tr> 
     <td>@req.title</td> 
     <td>@req.userName</td> 
    </tr> 
    } 
    </table> 
} 
+0

На самом деле, должно быть @if (! (Model.Any())). И спасибо за ясный ответ. – WClark