使用 Linq 中的分组从数据集中填充对象

Fill object from dataset using grouping in Linq

我正在尝试使用 Linq 将数据从 datatable 加载到对象。下面是我的场景。我有以下 table 结构和数据:

seq name    id  class
1   Rajesh  101 B
1   kumar   102 B
1   sandeep 104 A
2   Myur    105 B
2   Bhuvan  106 C
3   Siraz   107 A

下面是我的class结构

public class student
{
    public string name {get;set;}
    public string id { get; set; }
    public string meritClass { get; set; }
}

public class stdGroup
{
    public int seqId{get;set;}
    public List<student> students;
}

作为最终输出,我应该为每个序列构建一个 StudentstdGroup 对象应按 seq [三个对象] 分组创建。

示例:

stdGroup 对象 1 将包含 3 个学生对象

stdGroup 对象 2 将包含 2 个学生对象

谁能帮帮我。

这应该可以满足您的需求(假设您指的是 DataTable DataTable):

List<stdGroup> stdGroups = myDataTable
    .AsEnumerable()
    .GroupBy(a =>  a.Field<int>("Seq"), a => new student() { id = a.Field<string>("Id"), name = a.Field<string>("name"), meritClass = a.Field<string>("class") })
    .Select(a => new stdGroup() { seqId = a.Key, students = a.ToList() })
    .ToList();

要分解它,首先,让数据表行进入我们可以使用 linq 的状态,

.AsEnumerable()

现在,进行分组 - 选择 seq 作为组的键,并为每个条目构建一个学生对象,该对象将被分配到相应的组。

.GroupBy(a =>  a.Field<int>("Seq"), a => new student() { id = a.Field<string>("Id"), name = a.Field<string>("name"), meritClass = a.Field<string>("class") })

现在,为每个组创建 stdGroup 对象,并从我们的组键中填充 seq 属性,获取每个组的内容,并将其分配给students 属性.

.Select(a => new stdGroup() { seqId = a.Key, students = a.ToList() })    

最后,可选地,转换为列表而不是可枚举的。

.ToList();

你也可以看看我的实现:

public class dbStudent
{
    public int seq;
    public string name;
    public int id;
    public string meritClass;
}

public class student
{
    public string name { get; set; }
    public int id { get; set; }
    public string meritClass { get; set; }
}

public class stdGroup
{
    public int seqId { get; set; }
    public List<student> students { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        var dbStudebts = new List<dbStudent>();
        dbStudebts.Add(new dbStudent { seq = 1, name = "Rajesh", id = 101, meritClass = "B" });
        dbStudebts.Add(new dbStudent { seq = 1, name = "kumar", id = 102, meritClass = "B" });
        dbStudebts.Add(new dbStudent { seq = 1, name = "sandeep", id = 104, meritClass = "A" });
        dbStudebts.Add(new dbStudent { seq = 2, name = "Myur", id = 105, meritClass = "B" });
        dbStudebts.Add(new dbStudent { seq = 2, name = "Bhuvan", id = 106, meritClass = "C" });
        dbStudebts.Add(new dbStudent { seq = 3, name = "Siraz", id = 107, meritClass = "A" });

        var result = (from o in dbStudebts
                      group o by new { o.seq } into grouped
                      select new stdGroup()
                      {
                          seqId = grouped.Key.seq,
                          students = grouped.Select(c => new student()
                          {
                              name = c.name,
                              id = c.id,
                              meritClass = c.meritClass
                          }).ToList()
                      }).ToList();
    }
}