【问题标题】:Query aggregation with List of Objects使用对象列表查询聚合
【发布时间】:2014-11-19 05:36:58
【问题描述】:

我有一些定义如下的对象:

public class Customer
{
    public int CustId { get; set; }
    public string CustName{ get; set; }
}

public class Order
{
    public DateTime OrderDate { get; set; }
    public int CustId { get; set; }
    public int ProductId { get; set; }
    public int Quantity { get; set; }
    public int OrderId { get; set; }
}

public class DetailReport
{
    public Customer TheCustomer { get; set; }
    public IList<Orders> OrderList { get; set; }
}

为了报告的目的,我得到了一个 List 类型的对象,我从中创建了一个表格报告。

IList<DetailReport> detailReport

一切都很好,直到我要求根据 OrderDate 生成图表并获取当天的订单总数。

所以现在我必须取出具有 DateTime 值 (OrderDate) 和特定日期的订单 ID 计数的数据。

我可以执行以下操作吗?

from orderdata in detailReport.OrderList.........

我需要 detailReport 列表中的唯一日期和当天的 OrderId 计数

我怎样才能做到这一点?

【问题讨论】:

  • 您在任何地方都没有OrderId 字段。
  • 抱歉忘记粘贴了。现在好了
  • 为什么你的类定义有()Orders 是什么?我只看到一个Order 类。你的代码真的可以编译吗?你真的用 Visual Studio 写过这段代码吗?
  • 嗯,这是固定的。在 VS 中与此类似。

标签: c# linq list collections


【解决方案1】:

试试这个:-

 var result = report.SelectMany(x => x.OrderList)
                               .GroupBy(x => x.OrderDate.Date)
                               .Select(x => new
                                   {
                                       OrderDate = x.Key,
                                       OrderCount = x.Count()
                                   });

请查看Fiddle 获取我使用的示例数据。

【讨论】:

  • 如果 OrderDate 被保存到秒,例如在数据库中,我有像 '2014-11-07 03:58:46.000' 这样的日期,我可以分组到日期部分吗?
  • 然后简单地按Date 对象的DateTime 属性分组。您的 Groupby 应如下所示:GroupBy(x =&gt; x.OrderDate.Date.Date)
  • @progrAmmar - 欢迎您:)
【解决方案2】:

你可以这样写:

var Result = (from reportdata in detailReport
              from orderdata  in reportdata.OrderList
                 group orderdata by orderdata.OrderDate.Date into g
                 select new
                       {
                         OrderDate = g.Key,
                         Count = g.Count()
                       }).ToList();

WORKING EXAMPLE FIDDLE

或利用SelectMany() 将列表内的列表展平:

var Result = (from orderdata in detailReport.SelectMany(x=>>x.OrderList)
             group orderdata by orderdata.OrderDate.Date into g
             select new
                   {
                     OrderDate = g.Key,
                     Count = g.Count()
                   }).ToList();

WORKING EXAMPLE FIDDLE with SelectMany()

【讨论】:

  • 但是看到detailReport已经是Collection类型所以没有detailReport.OrderList这样的东西。 IList detailReport
  • 使用SelectMany()扁平化列表inisde列表
猜你喜欢
  • 2020-07-27
  • 2020-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-23
  • 2012-04-30
相关资源
最近更新 更多