2016-02-20 2 views
1

У меня есть данные, например.Группа LINQ по выбору с коллекцией

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

я хочу, чтобы сгруппировать эти записи по дате и возвращает идентификатор и Агент список, как:

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

Коллекция объект ID и группы агентов по дате. Пожалуйста, расскажите, как достичь этого, используя LINQ.

+0

Можете ли вы показать код и сказать, что случилось с ним. Используете ли вы LINQ для DataSet? –

ответ

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

Update

Если вам необходимо для каждой даты агентов, чтобы быть разделенный запятыми список агентов, как этот {(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"))+"}" 
           }) 
          }); 
+0

Спасибо за быстрый anwser. Я получил результат, но имею новую проблему. Как я могу получить список агентов (, отделенных) от объекта агентов позже в моем коде) – Devendra

+0

@Devendra Добро пожаловать. Должна ли это быть строка всего агента в определенную дату? – Christos

+0

Да. Один способ: Выбрать (gr => new { Дата = gr.Key, arrAgents = String.Join (",", gr.Select (z => z.Field ("Агент"))), Агенты = gr.Select (х => новый { Id = x.Field ("ID"), Агент = x.Field ("Агент") }) }); – Devendra

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; 

Это будет группа всех ваших данных в группы с Key на основе Log.Date, где каждая группа состоит из нескольких записей, каждая из которых содержит ID, Agent и Date Недвижимость.

Вот несколько примеров кода, как получить доступ result:

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 
}); 
Смежные вопросы