[英]Why does this linq query fail when I change the select clause to select new Model
为什么此查询有效:
var rooms = from m in db.Rooms
where
m.FK_HotelID == id
select m;
return View(rooms.ToList());
但是此查询(我从名为“ Linqer”的程序生成的查询)似乎失败了?
var rooms = from m in db.Rooms
where
m.FK_HotelID == id
select new Room
{
RoomID = m.RoomID,
RoomNumber = m.RoomNumber,
RoomType = m.RoomType,
FK_HotelID = m.FK_HotelID
};
return View(rooms.ToList());
我需要帮助以获取查询以返回Room
对象List
。 我认为我不能使用匿名类型或DTO模型进行查询,因为View需要使用Room
类型的对象。 该查询确实在Linqer程序中返回结果,但是当我尝试在VS2013 Project中获取此视图时,出现以下错误消息:
EntityFramework.SqlServer.dll中发生类型为'System.NotSupportedException'的异常,但未在用户代码中处理。
附加信息:不能在LINQ to Entities查询中构造实体或复杂类型'HotelApp.Models.Room'。
附言,这是我的房间课程供参考:
public partial class Room
{
public Room()
{
Bookings = new HashSet<Booking>();
}
public int RoomID { get; set; }
public int RoomNumber { get; set; }
public string RoomType { get; set; }
public int? FK_HotelID { get; set; }
public virtual ICollection<Booking> Bookings { get; set; }
public virtual Hotel Hotel { get; set; }
}
因为这里使用的是LINQ To SQL
,所以该查询将转换为对您的自定义类型一无所知的SQL
。
var rooms = (from m in db.Rooms
where
m.FK_HotelID == id
select m).ToList();
var roomsVm = from m in rooms select new Room
{
RoomID = m.RoomID,
RoomNumber = m.RoomNumber,
RoomType = m.RoomType,
FK_HotelID = m.FK_HotelID
};
return View(roomsVm.ToList());
这里发生的是:
1)第一个查询转到SQL,并找到您需要的所有房间。
2)然后将其转换为C#对象的列表。
3)此时的第二个查询正在使用LINQ To Objects
,因此可以使用您的自定义模型。
更好的解决方案是创建一个ViewModel
,其中包含您需要的所有字段,例如:
public class RoomViewModel {
public int RoomId {get;set;}
public string RoomNumber {get;set;}
public string HotelName {get;set;}
//and all other properties you need on your View
}
然后将您的DTO
映射到这个新的ViewModel
:
var roomsVm = from m in rooms select new RoomViewModel
{
RoomId = m.RoomID,
RoomNumber = m.RoomNumber,
HotelName = m.Hotel.HotelName
//and other properties
};
return View(roomsVm.ToList());
这是因为Room
是您的映射实体之一,并且不允许投影到映射实体。 您将必须使用DTO或项目为匿名类型。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.