我想使用CartLine
方法在Cart
中找到并返回与产品匹配的第一个FindProductInCartLines(int productId)
。如果找不到,请返回null
。
但是,编译器会抛出错误
无法隐式将类型:CartLine转换为Product
具有FirstOrDefault()
行号。
我是关于lambda函数和委托的真正的新手。我以为它已被line.Product.Id
取消引用,但显然我有某种误解。
我尝试使用来自Create IEnumerable<T>.Find()的JaredPar的答案 但是我看不出我的代码和他的代码之间的区别。
public class CartLine
{
public int OrderLineId { get; set; }
public Product Product { get; set; }
public int Quantity { get; set; }
}
public IEnumerable<CartLine> Lines => GetCartLineList();
private List<CartLine> GetCartLineList()
{
return new List<CartLine>();
}
public Product FindProductInCartLines(int productId)
{
return Lines.FirstOrDefault(line => line.Product.Id == productId);
}
答案 0 :(得分:1)
调用FirstOrDefault()
时,它将返回与源类型相同的对象,在您的情况下为Lines
,类型为CartLine
-这就是为什么您得到错误。要从父级获取子级属性,您需要在调用中添加对该属性的引用(允许为空)。
因此,在您的情况下,您需要:
public Product FindProductInCartLines(int productId)
{
return Lines.FirstOrDefault(line => line.Product.Id == productId)?.Product;
}
如果不确定?.
运算符,可以阅读this answer以获得很好的解释。
答案 1 :(得分:0)
// The method return type is Product
public Product FindProductInCartLines(int productId){
return Lines.FirstOrDefault(line => line.Product.Id == productId);// this line return CartLine object;
}
您应该将方法的返回类型更改为CartLine
public CartLine FindProductInCartLines(int productId){
return Lines.FirstOrDefault(line => line.Product.Id == productId);
}
如果您要退货
public Product FindProductInCartLines(int productId){
return Lines.FirstOrDefault(line => line.Product.Id == productId)?.Product;
}