C# LINQ group by select with collection

C# LINQ group by select with collection,c#,linq,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为且代理组按日期的集合对象。 请建议如何使用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为且代理组按日期的集合对象。
请建议如何使用LINQ实现它。

我认为下面的内容可以满足您的需要

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")
                          })
                      });

下面是我的示例类:

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;

你能出示你的密码并告诉我它出了什么问题吗。您正在使用LINQ数据集吗?谢谢您的快速回复。我得到了结果,但遇到了新的问题。我如何从代理对象中获取代理列表(,分隔),稍后在我的代码中)@Devendra不客气。这应该是特定日期中所有代理的字符串吗?是的。一种方法是.Select(gr=>new{date=gr.Key,arrAgents=string.Join(“,”,gr.Select(z=>z.Field(“代理”)),Agents=gr.Select(x=>new{Id=x.Field(“Id”)),Agent=x.Field(“Agent”)});稍等,这将创建一个匿名对象序列,其中包含两个属性,一个是日期,另一个是代理。代理将是另一个具有两个属性的序列,Id和代理。因此,这不是一个用逗号分隔的代理列表。为了理解您想要的内容,请根据您的输入指定确切的输出格式。非常感谢。
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;
result.ToList().ForEach(group =>
{
    Console.WriteLine(group.Key); // The date
    group.ToList().ForEach(entry => Console.WriteLine(entry.ID + " - " + entry.Agent)); // Print out each entry per group
});