LINQ to Entities 查询错误:“无法在 LINQ to Entities 查询中构造实体”
使用 Entity Framework 时,务必注意查询执行过程中可能出现的异常。一个常见的错误是“无法在 LINQ to Entities 查询中构造实体”,当尝试将查询结果投影到已映射的实体时会发生此错误。
错误原因
在给定的代码片段中,查询:
<code class="language-csharp">from p in db.Products where p.CategoryID == categoryID select new Product { Name = p.Name };</code>
尝试将查询结果投影到 Product 实体的新实例上。但是,在 LINQ to Entities 查询中,不能构造或重建实体,因为对象的状体由 ORM 管理。
解决方案:使用匿名类型或 DTO
为了克服此错误并执行自定义选择操作,您可以使用匿名类型或数据传输对象 (DTO)。匿名类型是一种临时命名类型,可以保存一组属性,而 DTO 则是一个自定义类,表示特定的域对象。
创建用于自定义选择的 DTO
在本例中,由于您只需要 Name 属性,您可以按如下方式创建 DTO:
<code class="language-csharp">public class ProductDTO { public string Name { get; set; } }</code>
修改查询以投影到 DTO
有了 DTO,您现在可以修改查询以将其投影到 DTO 上:
<code class="language-csharp">public List<ProductDTO> GetProducts(int categoryID) { return (from p in db.Products where p.CategoryID == categoryID select new ProductDTO { Name = p.Name }).ToList(); }</code>
通过投影到 DTO,您可以成功检索数据,同时避免“无法在 LINQ to Entities 查询中构造实体”错误。
以上是为什么我的linq到实体查询抛出'实体不能在linq中构造到实体查询”?的详细内容。更多信息请关注PHP中文网其他相关文章!