.net Linq投影

.net Linq投影,.net,linq-to-objects,.net,Linq To Objects,我有一个客户收集。在客户内部,我有另一个名为订单的集合 订单具有名称、订单日期、采购ID 如何编写Linq查询来为我提供仅包含OrderDate>QueryDate订单的新客户集合 这里的相关代码集有助于进行讨论。我只需要理解这个概念 class Customer { List<Order> Orders; } class Order { string Name; Date OrderDate; int PurchaseID; } List<Cu

我有一个客户收集。在客户内部,我有另一个名为订单的集合

订单具有名称、订单日期、采购ID

如何编写Linq查询来为我提供仅包含OrderDate>QueryDate订单的新客户集合

这里的相关代码集有助于进行讨论。我只需要理解这个概念

class   Customer
{
   List<Order> Orders;
}

class Order
{
   string Name;
   Date OrderDate;
   int PurchaseID;
}

List<Customer> customers;

我遇到了一个我不知道的新路障。Orders是一个只读属性。它需要通过客户访问。订单。添加。。。若并没有,那个么这个答案就行了。那么,如何只将过滤后的订单添加到订单中呢?

SelectMany用于预测和展平数据结构。有很多重载,但最简单的是这个

customers.SelectMany(c => c.Orders).Where(o => o.OrderDate > queryDate);

SelectMany用于投影和展平数据结构。有很多重载,但最简单的是这个

customers.SelectMany(c => c.Orders).Where(o => o.OrderDate > queryDate);
客户 .Selectc=> 新客户{Orders=c.Orders.Whereo=>o.OrderDate>DateTime.Now} ;

客户 .Selectc=> 新客户{Orders=c.Orders.Whereo=>o.OrderDate>DateTime.Now} ;

我认为你在林肯做不到。您必须执行以下操作:

var filtered = new List<Customer>();
foreach (var c in customers)
{
    var customer = new Customer();
    customer.Orders.AddRange(c.Orders.Where(o => o.OrderDate > queryDate));
    filtered.Add(customer);
}

我认为你在林克做不到。您必须执行以下操作:

var filtered = new List<Customer>();
foreach (var c in customers)
{
    var customer = new Customer();
    customer.Orders.AddRange(c.Orders.Where(o => o.OrderDate > queryDate));
    filtered.Add(customer);
}

假设您的类定义与提供的完全相同,但字段或属性是公共的,并且Customer有一个默认的公共构造函数,该构造函数使用空集合初始化其订单,那么您可以使用lambda语句,该语句将您限制为L2O,并阻止您使用L2S或EF:

var result = customers.Select(c =>
{
     var cf = new Customer();
     cf.Orders.AddRange(c.Orders.Where(o.OrderDate > QueryDate));
     return cf;
});

不幸的是,没有办法用表达式lambda实现这一点,因为C集合初始值设定项不允许您在其中拼接集合。

假设您的类定义与提供的完全相同,但字段或属性是公共的,客户有一个默认的公共构造函数,该构造函数使用空集合初始化其订单,如果您使用lambda语句将您限制为L2O,并阻止您使用L2S或EF,则可以这样做:

var result = customers.Select(c =>
{
     var cf = new Customer();
     cf.Orders.AddRange(c.Orders.Where(o.OrderDate > QueryDate));
     return cf;
});

不幸的是,无法使用表达式lambda执行此操作,因为C集合初始值设定项不允许您在集合内部拼接集合。

这将返回一个Customer集合,其中每个Customer只包含相关的订单。要求的是一份简单的订单清单。这实际上更接近我想要的。虽然我遇到了一个障碍,因为订单是一个只能获取的属性。请看我编辑的问题这将返回一个客户集合,其中每个客户只包含相关订单。要求的是一份简单的订单清单。这实际上更接近我想要的。虽然我遇到了一个障碍,因为订单是一个只能获取的属性。请查看我编辑的问题如果我没有弄错的话,这给我一个订单集合,我想要一个客户集合,其中一组订单被过滤掉。你是对的,对不起,我一定误读了这个问题。我以为你想要一个订单集合。如果我没有弄错的话,请给我一个订单集合,我想要一个客户集合,其中一组订单被过滤掉。你是对的,对不起,我一定误解了这个问题。我以为你想要一系列的订单。如果我们两种方式都能做到,那就太好了,因为这样做会很好。ThanksI已请求使用C功能在集合初始值设定项上下文中自动展开IEnumerable,以便您可以编写新客户{Orders={C.Orders.Whereo.OrderDate>QueryDate}-请参阅,如果你想在未来的C语言版本中看到这一特性或同一事物的不同语法,请投票支持它。如果我们可以同时使用这两种方法,那就太好了,因为这将非常有效。ThanksI已经请求一个C功能在集合初始值设定项上下文中自动扩展IEnumerable,这样您就可以编写例如new Customer{Orders={C.Orders.Whereo.OrderDate>QueryDate}-请参见,如果您想在将来的C版本中看到此功能或相同内容的不同语法,请投票支持它。