LINQ group by select with collection

时间:2016-02-20 08:30:35

标签: c# linq

我有一个数据表,例如

ID  Agent  Date
1   A1    2016-02-19
2   A1    2016-02-20
3   A2    2016-02-19
4   A3    2016-02-20

我希望按日期对这些记录进行分组,并返回ID和代理列表,如:

Date:2016-02-19 ,{(1,A1),(3,A2)}
Date:2016-02-20 ,{(2,A1),(4,A3)}

ID和代理Group by Date的集合对象。 请使用LINQ建议如何实现它。

2 个答案:

答案 0 :(得分:1)

我认为像下面这样的东西会做你想要的。

var result = datatable.AsEnumerable()
                      .GroupBy(row=>row.Field<DateTime>("Date"))
                      .Select(gr=>new 
                      {
                          Date = gr.Key,
                          Agents = gr.Select(x => new 
                          {
                              Id = x.Field<int>("ID"),
                              Agent = x.Field<string>("Agent")
                          })
                      });

<强>更新

如果您需要每个日期,代理商可以是逗号分隔的代理商列表, 像这样{(2,A1),(4,A3)},您可以尝试以下方法。

var result = datatable.AsEnumerable()
                          .GroupBy(row=>row.Field<DateTime>("Date"))
                          .Select(gr=>new 
                          {
                              Date = gr.Key,
                              Agents = "{"+ string.Join(",", 
                                       gr.Select(x => new 
                              string.Format("({0},{1})", 
                                  x.Field<int>("ID"), 
                                  x.Field<string>("Agent"))+"}"
                              })
                          });

答案 1 :(得分:0)

这是我的示例类:

public class Log
{
    public int ID { get; set; }
    public string Agent { get; set; }
    public DateTime Date { get; set; }

    public Log(int id, string agent, DateTime date)
    {
        ID = id;
        Agent = agent;
        Date = date;
    }
}

这里是带有一些测试数据的LINQ语句:

List<Log> list = new List<Log>()
{
    new Log(1, "A", new DateTime(2016, 01, 01, 0, 0, 0)),
    new Log(2, "B", new DateTime(2016, 01, 01, 0, 0, 0)),
    new Log(3, "C", new DateTime(2016, 01, 01, 0, 0, 0)),
    new Log(4, "A", new DateTime(2016, 01, 02, 0, 0, 0)),
    new Log(5, "A", new DateTime(2016, 01, 03, 0, 0, 0))
};

var result = from entry in list
             group entry by entry.Date
             into g
             select g;

这会将您的所有数据分组到基于Log.Date Key 组,其中每个组都包含多个条目,每个条目都有ID,{{1} }和Agent属性。

这里有一些示例代码如何访问Date

result