无法将类型List <<匿名类型:=“” .. =“” >>隐式转换为IEnumerable <product>

时间:2019-03-15 21:13:41

标签: c# asp.net entity-framework linq

我正在尝试执行linq查询Join,但是弹出了一个异常。

这是我的方法

public async Task<IEnumerable<Product>> TestProducts()
{
    var items = await _context.Products.Join(_context.ProductTypes,
         p => p.ProductId,
         c => c.ProductTypeId,
         (p, c) => new
         {
             productId = p.ProductId,
             number = p.Number,
             amount = p.Amount,
             primeCostEUR = p.PrimeCostEUR,
             nameType = c.NameType

         }).ToListAsync();
    return items;
}

这是我的模特

public class Product //: BaseObject
{
    public long ProductId { get; set; }
    public string Number { get; set; }
    public double Amount { get; set; }
    public double PrimeCostEUR { get; set; }

    public long ProductTypeId {  get; set; }
    public ProductType ProductType { get; set; }

    public long ProductParameterId { get; set; }
    public ICollection<ProductParameter> ProductParameters { get; set; } = 
    new List<ProductParameter>();
}

public class ProductType //: BaseObject
{
    public long ProductTypeId { get; set; }

    public string NameType { get; set; }

    public ICollection<Product> Products { get; set; }
    public ICollection<Parameter> Parameters { get; set; }

}

这是我遇到的错误:

  

错误CS0266无法将类型'System.Collections.Generic.List <>'隐式转换为'System.Collections.Generic.IEnumerable <.Models.Product>'。

2 个答案:

答案 0 :(得分:2)

似乎您的预期收益是ProductProductType模型类的组合。因此,如下所示创建一个DTO(数据传输对象)类,它将包含输出查询的所有字段。

public class ProductDto
{
    public long ProductId { get; set; }
    public string Number { get; set; }
    public double Amount { get; set; }
    public double PrimeCostEUR { get; set; }
    public string ProductTypeName { get; set; }
}

现在按如下所示编写控制器方法,其中方法的返回类型为IEnumerable<ProductDto>

public async Task<IEnumerable<ProductDto>> TestProducts()
{
    var items = await _context.Products.Select(p => new ProductDto
         {
             ProductId= p.ProductId,
             Number= p.Number,
             Amount= p.Amount,
             PrimeCostEUR= p.PrimeCostEUR,
             ProductTypeName = p.ProductType.NameType
         }).ToListAsync();
    return items;
}

此外,您不需要像以前那样显式的LINQ连接,可以像我更简单地使用EF投影一样实现相同的目的。

答案 1 :(得分:0)

更改此:

 var items = await _context.Products.Join(_context.ProductTypes,
             p => p.ProductId,
             c => c.ProductTypeId,
             (p, c) => new
             {
                 productId = p.ProductId,
                 number = p.Number,
                 amount = p.Amount,
                 primeCostEUR = p.PrimeCostEUR,
                 nameType = c.NameType

             }).ToListAsync();

对此:

 var items = await _context.Products.Join(_context.ProductTypes,
             p => p.ProductId,
             c => c.ProductTypeId,
             (p, c) => new Product  //as Product not anonymous
             {
                 productId = p.ProductId,
                 number = p.Number,
                 amount = p.Amount,
                 primeCostEUR = p.PrimeCostEUR,
                 nameType = c.NameType

             }).ToListAsync();