簡體   English   中英

當我更改select子句以選擇新模型時,為什么此linq查詢失敗

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM