Asp.Net MVC#其他信息:无法在LINQ to Entities查询中构造实体或复杂类型

Asp.Net MVC#其他信息:无法在LINQ to Entities查询中构造实体或复杂类型,c#,asp.net,asp.net-mvc,linq-to-entities,C#,Asp.net,Asp.net Mvc,Linq To Entities,我收到以下错误:无法在LINQ to Entities查询中构造实体或复杂类型“ebs.Models.ExtraItemVM”。在此行: booking.ExtraItemsVM = extralist.ToList(); 我还看到过其他的例子,它说如果您试图映射到实际的数据库表,就会出现这个错误 在我的例子中,我尝试映射到ViewModel 我的控制器代码如下 首先从数据库中获取“附加”列表: // get a list of extras var extralist = db.Ex

我收到以下错误:
无法在LINQ to Entities查询中构造实体或复杂类型“ebs.Models.ExtraItemVM”。
在此行:

 booking.ExtraItemsVM = extralist.ToList(); 
我还看到过其他的例子,它说如果您试图映射到实际的数据库表,就会出现这个错误

在我的例子中,我尝试映射到ViewModel

我的控制器代码如下

首先从数据库中获取“附加”列表:

 // get a list of extras
 var extralist = db.Extras.Where(x => x.hotel_id == AccID)
    .Select(e => new ExtraItemVM
     {
      eID = e.additem_id,
      Description = e.additem_text,
      Price = e.additem_cost,
      Count = 0
     });
然后创建一个新的“booking”视图模型,并尝试将附加列表附加到booking。ExtraItemsVM属性失败:

 Booking booking = new Booking();
 booking.ExtraItemsVM = extralist.ToList();        
视图模型*

 public class Booking
 {
    public int ID { get; set; }
    public bool HasResults { get; set; }
    public List<ExtraItemVM> ExtraItemsVM { get; set; }
  ...
  ...
 }

public class ExtraItemVM
{
    public int ID { get; set; }
    public long eID { get; set; }
    public string Description { get; set; }
    public decimal Price { get; set; }
    public int Count { get; set; }
}
我不认为我正在映射到数据库表-所以谁能帮我展示一下我做错了什么

谢谢,


Mark

我没有足够的信息来复制这个问题,但我有一种严重的感觉,那就是下面的代码部分

var extralist = db.Extras.Where(x => x.hotel_id == AccID)
   .Select(e => new ExtraItemVM
    {
     eID = e.additem_id,
     Description = e.additem_text,
     Price = e.additem_cost,
     Count = 0
    });

调试这一点的最简单方法可能是删除Select子句或Where子句,看看这是否可以解决您的问题。你可以分几步来做,而不是一下子做。

在这种情况下,我们需要更多的信息来真正找到根本原因。为了调试它,我将尝试的前两件事是

1) 验证查询(where子句)是否不会导致任何问题。为此,您需要在构建VM之前强制L2E运行查询

var extralist = db.Extras.Where(x => x.hotel_id == AccID)
                  .AsEnumerable()  //This will force L2E to execute the query
                  .Select(e => new ExtraItemVM
                         {
                              eID = e.additem_id,
                              Description = e.additem_text,
                              Price = e.additem_cost,
                              Count = 0
                         });
2) 第二个选项是删除VM类并使用匿名类

var extralist = db.Extras.Where(x => x.hotel_id == AccID)
                  .Select(e => new ()
                         {
                              eID = e.additem_id,
                              Description = e.additem_text,
                              Price = e.additem_cost,
                              Count = 0
                         })
                  .AsEnumerable();
如果第二个选项有效,那么您的虚拟机对L2E不合法。为了在
Select
语句中构建类,必须使用带有默认构造函数的类(就像在示例代码中一样)。
一个很好的问题可以解释这一点:

我要尝试的第一件事是在
之前添加
.AsEnumerable()
。选择([…]
Hi@Alexanderondeau-就是这样-谢谢你-如果你作为答案提交…干杯,MarkHi@pitaylor-谢谢你的建议。它在尝试附加到预订视图模型时仍然出错。在删除select子句后仍然出错?@Alexanderondeau是正确的,我只是对它在elimin之后出错感到惊讶Hi-是的,当我试图将它附加到viewmodel时。这是一个比我的答案好得多的答案。我只想阐明在这个例子中理解延迟加载的重要性。
var extralist = db.Extras.Where(x => x.hotel_id == AccID)
                  .Select(e => new ()
                         {
                              eID = e.additem_id,
                              Description = e.additem_text,
                              Price = e.additem_cost,
                              Count = 0
                         })
                  .AsEnumerable();