[英]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.