来自DB的原始数据分组

时间:2016-12-01 08:17:53

标签: c# c#-4.0 lambda generic-collections

这是我来自DB的原始数据:

 product-list
 |
 |--- component
 |    |
 |    |--- product-list.component.ts
 |    |--- product-list.component.html
 |    |--- product-list.component.css
 |
 |--- model
 |    |
 |    |--- product.ts
 |
 |--- service
      |
      |--- product-service.ts

来自C#的课程结束:

PrimaryColumn   StudentId  StudentName  CourseName  CourseId  CourseDuration
     1               1           X         Cse1       C1          2
     2               1           X         Cse2       C2          1 
     3               1           X         Cse3       C3          3
     4               2           Y         Cse1       C1          2
     5               2           Y         Cse4       C4          5

我的目标是获取由学生分组的数据以及他们将使用public class Student { public int StudentId {get; set;} public string StudentName {get; set} public List<Course> Courses {get; set;} } public class Course { public int CourseId {get; set;} public string CourseName {get; set;} public int CourseDuration {get; set; } } 作为学生班级属性完成的课程。

所以,我认为目标很明确。所以,我继续使用GroupBy来处理从DB到C#的原始数据,希望得到结果,但无济于事。

到目前为止,这是我得到的最好的。

List<Course>

虽然这不能让我得到我想要的东西。通过一些次要的代码解决方法发布此调用,我能够实现我所需要的。但是,每当我无法正确分组原始数据时,我都会感到烦恼。

如果有人能告诉我正确的方法来进一步优化上述代码或完全以不同的方式完成,那将会非常有用。

这是我需要将结果放在 masterData.GroupBy(x => new { x.StudentId, x.StudentName }, (key, group) => new { StudentId = key.StudentId, StudentName = key.StudentName, Courses=group.ToList() }).ToList();

中的方式
List<Student>:

干杯

3 个答案:

答案 0 :(得分:1)

你可以这样做:

这里有完整示例:dotNetFiddle

List<Student> result = data.GroupBy(x => new { x.StudentID, x.StrudentName }, 
            (key, group) => new Student{ 
                                          StudentId = key.StudentID, 
                                          StudentName = key.StrudentName,                
                                          Courses = GetCourses(group)}).ToList();

    //You can do this operation with Reflection if you want. If you don't want to write manually the property names.
    public static List<Course> GetCourses(IEnumerable<RawData> data)
    {
        List<Course> course = new List<Course>();

        foreach(var item in data)
        {
            Course c = new Course();

            c.CourseDuration = item.CourseDuration;
            c.CourseId = item.CourseID;
            c.CourseName = item.CourseName;

            course.Add(c);
        }

        return course;
    }

答案 1 :(得分:0)

我在你的案子中做了什么(但我不确定你会把它看成是'正确分组')是

var groupedStudents = masterData.GroupBy(x => x.StudentId);
foreach (var studentGroup in groupedStudents)
{
    // new studentclass
    var student = new Student(studentGroup.First().StudentId, studentGroup.First().StudentName);
    foreach (var studentRecord in studentGroup)
    {
        student.Courses.Add(new course(studentRecord.CourseId, studentRecord.CourseName, studentRecord.CourseDuration);
    }

    // add the student-object to where you want to save them i.e.
    this.MyStudentList.Add(student);
}

答案 2 :(得分:0)

这里的问题是数据库组织不良,远离标准化状态。但你可以处理好像它被正确分隔到不同的表。这样你就可以提取课程,学生然后汇总它们 - 下面的代码应该给出一个线索

// get all courses
var courses = masterData.GroupBy(x => x.CourseId).Select(group => group.First())
.Select(x => new Course {CourseId = x.CourseId, CourseName = x.CourseName, ...})
.ToDictionary(x => x.CourseId);

// get all students (with empty courses for now)
var students = masterData.GroupBy(x => x.StudentId).Select(group => group.First())
.Select(x => new Student {StudentId = x.StudentId, ...})
.ToDictionary(x => x.StudentId);

// fill students with courses
foreach(var data in masterData)
{
    student[data.StudentId].Courses.Add(courses[data.CourseId]) 
}

我认为这是一种明确的方法,可以在表格规范化后重复使用。或者,您可以尝试通过单个查询编写复杂的LINQ来完成所有这些工作人员