如何从LINQ加载ViewModel并将其传递给View

时间:2017-03-03 20:03:53

标签: c# asp.net-mvc linq

我们如何通过ViewModel查询选择声明 - 将以下LINQ传递给视图。我收到的错误如下所示。 请注意我还想通过LINQ查询的select语句加载ViewModel:

模型

Public class Customer
{
  Public int CustomerId {get; set;}
  Public string FullName {get; set;}
  ...
}

Public class Order
{
  Public int OrderId {get; set;}
  Public int CustomerId {get; set;}
  Public float Price {get; set;}
  ...
}

视图模型:

Public class CustomViewModel
{
  Public String Name {get; set;}
  Public float Price {get; set;}
  ...
}

查看

@model myProject.Models.CustomViewModel
...

控制器

var qry = from c in _context.Customers
          join o in context.Orders on c.CustomerId = o.CustomerId
          select new CustomViewModel { Name = c.FullName, Price = o.Price  };

return View(qry);

错误

  

传递给ViewDataDictionary的模型项的类型为' Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1 [myProject.Models.CustomViewModel]。但是这个ViewDataDictionary实例需要一个类型为' myProject.Models.CustomViewModel]'

的模型项

1 个答案:

答案 0 :(得分:2)

您要传递IQueryable<CustomViewModel> CustomViewModel,而不是您想要的@model IEnumerable<myProject.Models.CustomViewModel> 实例。我想您想获取名称列表,因此您应该将视图中的模型类型更改为

return View(qry.ToList());

此外,您应该在将结果传递给视图之前实现查询:

DbContext

否则,当您尝试在视图中点击查询结果时,您的return View(qry.FirstOrDefault()); 将被处理,因此会抛出异常。

更新

如果您想显示与某个特定客户相关的信息,我建议您使用FirstOrDefault扩展方法:

$("#yearSlider").slider({step: 20000, min: 0, max: 200000})