我有以下课程:
class Order
{
public string AccountNumber;
public string AccountName;
public List<OrderLine> OrderLines = new List<OrderLine>();
public DateTime StartDate;
public DateTime EndDate;
}
class OrderLine
{
public string Description;
public string ProductCode;
public double Duration;
public int Quantity;
}
根据以下条件来获取Order
对象列表的LINQ代码是什么?
答案 0 :(得分:2)
假设您希望所有记录都符合这两个条件(对于任何令人满意的OrderLine
,否则请更改为All()
):
public static void IEnumerable<Order> GetQualifying(this IEnumerable<Order> orders, string accountNo, int minQty) {
return orders.Where(o =>
o.AccountNumber == accountNo
&& o.OrderLines.Any(ol => ol.Quantity >= minQty);
}
请注意不要出现一个错误的错误,因为我已经从字面上解释了“最小数量”。
此外,this
语法非常适合编写extension methods,使您可以像这样调用:
Order[] orders = //stuff;
Order[] qualifiedOrders = orders.GetQualifying("1234", 9).ToArray();
请注意,我建议您在无法再从lazy evaluation中受益时立即使用ToArray()
,否则,请对原始IEnumerable<>
will cause reevaluation进行后续操作(阅读:列举再次收集。)
答案 1 :(得分:0)
您可以选择:
list.Where(x => x.AccountNumber == "12345" && x.OrderLines.Any(o => o.Quantity > 10));
或:
list.Where(x => x.AccountNumber == "12345" && x.OrderLines.All(o => o.Quantity > 10));
取决于您是否要检索AccountNumber
为12345
且所有OrderLine
数量大于10的所有对象,或者是否全部
OrderLine
数量大于10