c# - 使用 Linq 获取每个客户昨天下的最后一个订单

标签 c# linq

我有以下两个POCO

public class Customers
{
    public Guid Id { get; set; }
    public string FirstName{ get; set; }
    public string LastName{ get; set; }
}

public class Orders
{
    public Guid Id { get; set; }
    public Guid CustomerId { get; set; }
    public string Product { get; set; }
    public DateTime Date { get; set; }
}

假设我的数据服务返回一个 List 和 List,我将如何使用 Linq 获取每个客户昨天下的最后一个订单?

我想返回 Customer.Id、Customer.FirstName、Customer.LastName、Order.Id、Order.Date 和 Order.Product(作为来自 Controller 操作的 Json),所以我还需要创建一个新的 POCO 来保持结果?类似于以下内容:

public class CustomerOrders
{
    public Guid CustomerId {get;set;}
    public string FirstName {get;set;}
    public string LastName {get;set;}
    public Guid OrderId {get;set;}
    public DateTime Date {get;set;}
    public string Product {get;set;}
}

我之前发布了一个关于使用 Linq 处理列表的类似问题。我还在学习 Linq,这些问题让我有些困惑。我希望有人能提供帮助。

最佳答案

试试这个:

var results = customers
    .Select(c =>
        orders
            .Where(o => o.CustomerId == c.Id)
            .Where(o => o.Date.Date == DateTime.Now.AddDays(-1).Date)
            .OrderByDescending(o => o.Date)
            .Select(o => new CustomerOrders()
            {
                Product = o.Product,
                Date = o.Date,
                CustomerId = c.Id,
                LastName = c.LastName,
                FirstName = c.FirstName,
                OrderId = o.Id
            })
            .First())
    .ToList();

这是处理客户没有符合条件的相应订单的情况的另一个版本:

var results = customers
    .Select(c =>
        orders
            .Where(o => o.CustomerId == c.Id)
            .Where(o => o.Date.Date == DateTime.Now.AddDays(-1).Date)
            .OrderByDescending(o => o.Date)
            .DefaultIfEmpty()
            .Select(o => new CustomerOrders()
            {
                Product = o == null ? default(string) : o.Product,
                Date = o == null ? default(DateTime) : o.Date,
                CustomerId = c.Id,
                LastName = c.LastName,
                FirstName = c.FirstName,
                OrderId = o == null ? default(Guid) : o.Id
            })
            .First())
    .ToList();

关于c# - 使用 Linq 获取每个客户昨天下的最后一个订单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33313240/

相关文章:

c# - 模型绑定(bind)不适用于嵌套对象

vb.net - 使用LINQ过滤DBNull

c# - FirstOrDefault 是否在 LINQ 中延迟?

c# - 表达式树中未发生隐式转换

c# - 检索树路径列表

c# - 在应用程序栏项目中添加/删除事件订阅者?

c# - 如何比较 2 个 XML 文档?

c# - `string[] args` 究竟是如何填充到 C# Main 方法中的?

c# - 在 Mvc 4 中使用每类型表继承将对象添加到数据库

c# - 获取 List<T> 中最常见的项目并在之后排序