> 到 IEnumerable,c#,asp.net,entity-framework,linq"/>

首页 > 解决方案 > 无法隐式转换类型 List<> 到 IEnumerable

问题描述

我正在尝试执行 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>”。

标签: c#asp.netentity-frameworklinq

解决方案


看来您的预期回报输出是两者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 投影来实现与我所做的相同的事情,而且更简单。


推荐阅读