Linq过滤嵌套集合并保留父实体

时间:2018-03-09 09:05:06

标签: c# linq

我想以成本>获得客户及其订单; 100,这意味着我想访问client.Orders并仅获取cost > 100的内容。

var list1 = list.SelectMany(c => c.Orders.Where(x => x.Cost > 100), (c,x)=> c).Distinct();

public class Client
{
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public int Age { get; set; }
        public bool ClubMember { get; set; }

        public List<Order> Orders { get; set; }
}

public  class Order
{
        public int ItemCount { get; set; }
        public int Cost { get; set; }
}

这将返回所有具有成本&gt;的订单的客户。 100,我希望过滤掉订单并跳过所有与我的条件不匹配的订单。我在其他方面尝试过,但没有成功:(对方法的解释也很棒。

2 个答案:

答案 0 :(得分:3)

我认为您不想修改客户对象的内容,这是我的建议:

        var list2 = list.Select(c => new  // 1
        {
            client = c,
            orders = c.Orders.Where(x => x.Cost > 100)
        })
        .Where(a => a.orders.Any())  //2
        .ToList();

1-选择一个新实体,其中包含(对于每个初始客户端)对客户端的引用以及其订单的筛选列表

2-仅保留至少有一个订单(已过滤)的对象

答案 1 :(得分:0)

也许是这样:

var clientsWithOnlyOneCost100 = clients.Select(c => new
{
    client = c,
    orders = c.Orders.Where(o => o.Cost > 100)
})
    .Where(x => x.orders.Count() == 1);