我正在尝试执行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>'。
答案 0 :(得分:2)
似乎您的预期收益是Product
和ProductType
模型类的组合。因此,如下所示创建一个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();