2016-08-20 65 views
1

我想从我的控制器传递数据以查看。 这里是控制器的代码如何通过自定义查询结果在asp.net中查看

public ActionResult AllCars() 
    { 
     try 
     { 
      int id = System.Web.HttpContext.Current.User.Identity.GetUserId<int>(); 


      var reservedCars = (from c in db.Cars 

          join o in db.Orders on c.Car_Id equals o.Car_Id 
          join u in db.AspNetUsers on o.Id equals u.Id 
          where u.Id == 5 
          select new 
          { 
           c.Car_Description, 
           c.Car_Id, 
           c.CarMakeId, 
           c.CarModelId, 
           c.Reservation_Status, 
           c.Color 
          }); 

     return View(reservedCars); 
    } 
    catch (Exception) 
    { 

     throw; 
    } 
} 

这里是我的观点文件。

@model IEnumerable<FinalProject.Models.ReservedCar> 



<table> 
    @foreach (var item in Model) 
    { 
     <tr> 
      <td> 
       @Html.DisplayFor(modelItem => item.Car_Id); 
      </td> 
     </tr> 
    } 
    </table> 

但是当我跑我认为我得到了以下错误 传递到字典的模型项的类型为“System.Data.Entity.Infrastructure.DbQuery但本词典需要类型的模型项目”系统.Collections.IEnumerable'

我知道即时传递dbquery结果来查看和我的看法是期待它将iEnumerable。 请指导我如何实现这项任务。?我只是想将查询结果传递给我的视图,并希望使用它。

ModelClass。 ReservedCar.cs

namespace FinalProject.Models 
{ 
    using System; 
    using System.Collections.Generic; 
    using System.ComponentModel.DataAnnotations; 
    using System.ComponentModel.DataAnnotations.Schema; 
    using System.Data.Entity.Spatial; 

    public partial class ReservedCar 
    { 

     public int Id { get; set; } 

     public string Car_Description { get; set; } 

     public int Car_Id { get; set; } 

     public string CarMakeId { get; set; } 

     public string CarModelId { get; set; } 
     public string Reservation_Status { get; set; } 

     public string Color { get; set; } 
    } 
} 
+0

结束与'查询重做代码。 ToList()'或传递给视图'reservedCars.ToList()' –

回答

3

reservedCars目前仍然是IQueryable类型的查询表达式。尚未评估/执行。因此,reservedCars的类型与您的视图强类型为(IEnumerable<ReservedCar>)的类型不同。这就是你得到类型不匹配错误的原因。

请确保您返回的是ReservedCar类的集合。您可以更新LINQ表达式的投影部分,以将结果投影到ReservedCar而不是匿名对象。同时在查询中调用ToList()方法,该方法将执行查询表达式并返回结果。

var reservedCars = (from c in db.Cars 

          join o in db.Orders on c.Car_Id equals o.Car_Id 
          join u in db.AspNetUsers on o.Id equals u.Id 
          where u.Id == 5 
          select new ReservedCarVm 
          { 
           CarId = c.Car_Id, 
           Description = c.Car_Description, 
           Color = c.Color 
           // Map other properties as needed. 
          }).ToList(); 
return View(reserverCars); 

假设你ReservedCarVm类有ColorCar_DescriptionCar_Id性质是类似下面

public class ReservedCarVm 
{ 
    public string Color { set;get;} 
    public string Description { set;get;} 
//Add other properties needed by the view here 
} 

现在确保你的看法是强类型的集合类型相同那些在Car实体类的这个视图模型类

@model IEnumerable<ReserverdCarVm> 
@foreach(var item in Model) 
{ 
    <p>@item.CarId</p> 
    <p>@item.Color</p> 
} 
+0

仍然在控制器中出错。 'FinalProject.Models。ReservedCar'不能在LINQ to Entities查询中构造。 答案已更新。请检查我的模型类。 –

+0

你有一个叫ReserverCar的类吗?它看起来像什么?它有和我们使用的相同的性能吗? – Shyju

+0

检查我的模型类在更新的问题。是的,它拥有所有这些属性。 –

0

你可以这样做:

相反@model的IEnumerable的< FinalProject.Models.ReservedCar>
你可以做@model的IQueryable < FinalProject.Models.ReservedCar>

以上不建议,你不应该直接从视图调用数据库,我没有看到有任何理由这样做。

还需要处置的DbContext,在你提供的代码,你是不是配置的dbconext这是不好的

只凭这

var reservedCars = (from c in db.Cars 

          join o in db.Orders on c.Car_Id equals o.Car_Id 
          join u in db.AspNetUsers on o.Id equals u.Id 
          where u.Id == 5 
          select new 
          { 
           c.Car_Description, 
           c.Car_Id, 
           c.CarMakeId, 
           c.CarModelId, 
           c.Reservation_Status, 
           c.Color 
          }).ToList(); 
    db.Dispose(); 
+0

仍然通过你的代码和解决方案出错 传入字典的模型项目类型为“System.Data.Entity.Infrastructure.DbQuery”,但是这个字典需要一个'System.Linq.IQueryable'类型的模型项目 –

+0

为什么你需要查询查看? –