【问题标题】:The entity or complex type 'Ws.Models.XXXX' cannot be constructed in a LINQ to Entities query无法在 LINQ to Entities 查询中构造实体或复杂类型“Ws.Models.XXXX”
【发布时间】:2015-04-28 21:17:04
【问题描述】:

我正在与我的 MVC4 WEBAPI 项目一起工作。我所做的只是使用 DTO(samplemodelDTO) 生成 Web 服务,如下所示。

namespace Ws.Models
{
    public class samplemodelDTO
    {
        [Key]
        public int id { set; get; }

        public string Productname { get; set; }

        public int Productquantity { get; set; }

        public string ProductReview { get; set; }        
    }
}

这个 DTO 在控制器中的使用如下,因为它从两个表中获取数据。我搜索了很多,也使用了匿名对象,但它仍然抛出相同的内部异常。

我也在这里搜索过,但我仍然找不到任何解决方案。任何指导将不胜感激。干杯。

public IQueryable<samplemodelDTO> Getproducts()
{
    var query = from t in db.products
                join p in db.ratings on t.product_id equals p.prod_id
                select new samplemodelDTO()
                {
                    Productname = t.product_name,
                    Productquantity = t.quantity,
                    ProductReview = p.rating1
                };

    return query;
}

它抛出的错误是 this

【问题讨论】:

  • 是否需要返回IQueryable&lt;T&gt;
  • 要么您没有显示完整的 samplemodelDTO 类声明,要么您的 EF 上下文以某种方式知道 samplemodelDTO 类型并认为它是 EDM 的一部分。您的实体之一是否引用samplemodelDTO?如果答案是肯定的,您需要意识到 DTO 并不意味着是域模型的一部分,而仅用于以类型安全的方式传输数据。
  • 我尝试了 List 和 IQueryable 两种方式。但没有从中得到任何东西
  • @haim770 它是完整的 DTO 类兄弟。
  • @haim770 ,我的上下文不知道 DTO。而且我知道它意味着客户端的数据呈现,因为它提供了灵活性

标签: c# linq asp.net-mvc-4 ef-code-first


【解决方案1】:

请尝试以下一种,使用与上下文模型不同的命名空间以获得更安全的一面。

namespace <NewNamespaceforDTO> //Ws.Models 
{
    public class samplemodelDTO
    {            
        public int id { set; get; }    
        public string Productname { get; set; }  
        public int Productquantity { get; set; }   
        public string ProductReview { get; set; }    
    }
}

public List<samplemodelDTO> Getproducts()
{
     var query = from t in db.products.AsEnumerable()
                 join p in db.ratings.AsEnumerable() on t.product_id equals p.prod_id
                 select new samplemodelDTO()
                 {
                      Productname=t.product_name,
                      Productquantity=t.quantity,
                      ProductReview=p.rating1
                 };
      return query.ToList();
}

它可能有用。

【讨论】:

  • 这也会将两个表完全检索到内存中,并在内存中执行连接。性能不会从此解决方案中受益。
  • 为什么要使用不同于我的模型和上下文所在的命名空间?我没明白@Razak Raz
  • @Razack Raz,感谢您的提示。你能告诉我 AsEnumerable 在这里做什么吗?为什么没有 AsEnumerable 就无法工作?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-11
  • 2017-05-31
  • 2015-02-06
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多