繁体   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