【问题标题】:how to pass custom query results to view in asp.net如何传递自定义查询结果以在 asp.net 中查看
【发布时间】:2016-08-20 16:28:32
【问题描述】:

我想将数据从我的控制器传递给查看。 这是控制器的代码

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”,但此字典需要“System.Collections.IEnumerable”类型的模型项

我知道我将 dbquery 结果传递给视图,我的视图预计它将是 iE​​numerable。 请指导我如何完成这项任务。?我只是想将查询结果传递到我的视图中并想使用它。

模型类。 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; }
    }
}

【问题讨论】:

  • .ToList() 结束查询或传递给视图reservedCars.ToList()

标签: c# asp.net .net asp.net-mvc asp.net-mvc-4


【解决方案1】:

目前reservedCars 仍然是IQueryable 类型的查询表达式。它尚未评估/执行。所以reservedCars 的类型不同于你的视图的强类型(IEnumerable&lt;ReservedCar&gt;)。这就是您收到类型不匹配错误的原因。

确保您返回的是 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 属性,它们与Car 实体类中的属性类型相同,如下所示

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

现在确保您的视图被强类型化到此视图模型类的集合中

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

【讨论】:

  • 控制器中仍然出现错误。无法在 LINQ to Entities 查询中构造“FinalProject.Models.ReservedCar”。答案已更新。请检查我的模型类。
  • 你有一个名为 ReserverCar 的类吗?它看起来怎么样?它的属性和我们使用的一样吗?
  • 在更新的问题中检查我的模型类。是的,它具有所有这些属性。
  • Car 类的外观如何?它们有相同的属性吗?
  • 是的,我仔细检查过,我在汽车模型中拥有所有这些属性。但仍然出现以下错误。附加信息:无法在 LINQ to Entities 查询中构造实体或复杂类型“FinalProject.Models.ReservedCar”。
【解决方案2】:

你可以这样做:

代替@model IEnumerable
你可以做@model IQueryable

以上不推荐,你不应该直接从视图调用数据库,我看不出有什么理由这样做。

您还需要处理 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();

【讨论】:

  • 您的代码和解决方案仍然出错。传入字典的模型项的类型为“System.Data.Entity.Infrastructure.DbQuery”,但该字典需要一个“System.Linq.IQueryable”类型的模型项
  • 为什么需要在视图中查询?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多