2017-02-15 3 views
0

Как сгруппировать данные ниже? поскольку я просматриваю коллекцию, и она дает мне только 1 строку, так как нет никакой группировки. Мне нужно сгруппировать нижеследующие записи на основе столбца Id и если есть повторяющиеся идентификаторы? Мне нужно заполнить модель множеством строк.Как использовать группу по строкам?

id name trID trName 
1 a   5  x 
2 b   6  y 
2 c   7  z 
3 d   8  m 
3 e   9  n 
4 f   10 0 


class DataModel 
{ 

    Public int Id{get;set;} 
    Public string name{get;set;} 
    Public RepeatedIDs RepeatedIDCollection{get;set;} 

} 

class RepeatedIDs 
{ 
    Public int trId{get;set;} 
    Public string trname{get;set;} 
} 

(from DataRow dr in dataTable.Rows 
select new IdModel 
{ 
    Id = Convert.ToInt32(dr["ID"]), 
    name = Convert.ToString(dr["name"]), 

    // need to group the records here and populate below mode with that many rows 
    RepeatedIDCollection = new List<RepeatedIDs> 
     { 
      new RepeatedIDs() 
      { 
       trId = Convert.ToInt32(dr["trId"]), 
       trname = Convert.ToString(dr["trname"]), 
      } 
     } 
}).ToList(); 
+1

Вы могли бы попробовать это dataTable.Rows.GroupBy (х => x.Id) .Select (г => новый {Id = g.Key} –

ответ

0

Что вам нужно:

var query = dataTable.AsEnumerable() 
    .GroupBy(r => r.Field<int>("ID")) 
    .Select(grp => new DataModel 
    { 
     Id = grp.Key, 
     name = String.Join(",", grp.Select(t => t.Field<string>("name"))), //Because there could be multiple names 
     RepeatedIDCollection = grp.Select(t => new RepeatedIDs 
     { 
      trId = t.Field<int>("trID"), 
      trname = t.Field<string>("trName") 
     }).ToList(), 
    }); 

Что этот запрос делает:

  • Группировка данных на основе ID столбца в DataTable
  • Позже выбора объекта DataModel
  • Id в DataModel - это ключ от группы.
  • Там будет несколько имен в сгруппированных данных
  • Позже он создает List<RepeatedIDCollection>, получая trId и trname из сгруппированных коллекции.

Обязательно укажите правильные типы в методе Field.

+0

У меня есть еще один столбец типа Datetime, если я использую это рядом с столбцом имен, появляется сообщение об ошибке «Невозможно преобразовать sourcetype System.Collections.Generic.IEnumerable в targettype« System.Datetime », и вот мой код, который почти похоже на то, что вы предложили, я только изменил тип столбца CreateDate = grp.Select (t => t.Field («RecordCreatedDatetime»)) - что это, что я пропал без вести, не могли бы вы посоветуете – Amit

+0

@ Amit, есть/могут быть несколько дат в сгруппированном reco выстр. Вам нужно либо выбрать один/первый, либо изменить свой «CreateDate», чтобы принять набор дат. Если вы собираетесь выбрать первый, который вы можете сделать: 'CreateDate = grp.First (t => t.Field (" RecordCreatedDatetime "))', * (Помните, что 'First' будет генерировать исключение, если запись не найдена) * – Habib

+0

Я использую первый метод, как из моего примера выше, у меня будет одна строка, которая будет содержать одно значение даты, поэтому сначала будет работать. Тем не менее, я получаю еще одну строку msg @ t.Field («RecordCreatedDatetime»), которая говорит, что не может преобразовать System.Datetime в bool Невозможно преобразовать лямбда-выражение в предполагаемый тип делегата, потому что некоторые из значений в блоке не являются неявно конвертируемыми , Я проверил тип столбца, и он имеет тип System.Datetime – Amit

0

Попробуйте следующее:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Data; 
namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      DataTable dt = new DataTable(); 
      dt.Columns.Add("id", typeof (int)); 
      dt.Columns.Add("name", typeof (string)); 
      dt.Columns.Add("trID", typeof (int)); 
      dt.Columns.Add("trName", typeof (string)); 

      dt.Rows.Add(new object[] { 1,"a", 5,"x"}); 
      dt.Rows.Add(new object[] { 2,"b", 6,"y"}); 
      dt.Rows.Add(new object[] { 2,"c", 7,"z"}); 
      dt.Rows.Add(new object[] { 3,"d", 8,"m"}); 
      dt.Rows.Add(new object[] { 3,"e", 9,"n"}); 
      dt.Rows.Add(new object[] { 4,"f", 510,"0"}); 

      var groups = dt.AsEnumerable().GroupBy(x => x.Field<int>("id")).ToList(); 

     } 
    } 



} 
Смежные вопросы