0

我有以下课程:

public class Student
{
    public string StudentID { get; set; }
    public string StudentName { get; set; }
}
public class Marks
{
    public string StudentID { get; set; }
    public string SubjectName { get; set; }
    public string Score { get; set; }
} 

填充集合:

Collection<Student> objStudentCollection = new Collection<Student>();
Student student = new Student();
student.StudentID = "104517";
student.StudentName = "John";
objStudentCollection.Add(student);

student = new Student();
student.StudentID = "104520";
student.StudentName = "Stella";
objStudentCollection.Add(student);

Collection<Marks> objMarkCollection = new Collection<Marks>();
Marks marks = new Marks();
marks.StudentID = "104517";
marks.SubjectName = "English";
marks.Score = "85";
objMarkCollection.Add(marks);

marks = new Marks();
marks.StudentID = "104517";
marks.SubjectName = "Science";
marks.Score = "60";
objMarkCollection.Add(marks);


marks = new Marks();
marks.StudentID = "104517";
marks.SubjectName = "Mathematics";
marks.Score = "75";
objMarkCollection.Add(marks);


marks = new Marks();
marks.StudentID = "104517";
marks.SubjectName = "Optional 1";
marks.Score = "75";
objMarkCollection.Add(marks);


marks = new Marks();
marks.StudentID = "104520";
marks.SubjectName = "French";
marks.Score = "54";
objMarkCollection.Add(marks);

marks = new Marks();
marks.StudentID = "104520";
marks.SubjectName = "Science";
marks.Score = "60";
objMarkCollection.Add(marks);


marks = new Marks();
marks.StudentID = "104520";
marks.SubjectName = "Mathematics";
marks.Score = "75";
objMarkCollection.Add(marks);


marks = new Marks();
marks.StudentID = "104520";
marks.SubjectName = "Optional 1";
marks.Score = "50";
objMarkCollection.Add(marks);

我想在 GridView 中绑定上述集合以显示如下:

学生证 | 学生姓名 | 英语 | 法语 | 数学 | 科学 | 可选 1 | 全部的

4

1 回答 1

1

我认为你需要利用GroupJoin方法来获得你想要的东西。如果主题列表是固定的并且不会改变,你可以这样做:

var q = 
  objStudentCollection
  .GroupJoin(
    objMarkCollection,
    stu => stu.StudentID,
    mark => mark.StudentID,
    (stu, mark) =>
        new
        {
            student.StudentID,
            student.StudentName,
            English = mark.Where(m => m.SubjectName == "English").Sum(m => Convert.ToInt32(m.Score)),
            French  = mark.Where(m => m.SubjectName == "French").Sum(m => Convert.ToInt32(m.Score)),
            Mathematics  = mark.Where(m => m.SubjectName == "Mathematics").Sum(m => Convert.ToInt32(m.Score)),
            Science   = mark.Where(m => m.SubjectName == "Science").Sum(m => Convert.ToInt32(m.Score)),
            Optional1  = mark.Where(m => m.SubjectName == "Optional 1").Sum(m => Convert.ToInt32(m.Score)),
            Total = mark.Sum(m => Convert.ToInt32(m.Score)),
        })

它不是世界上最漂亮的代码,但它会给你一个匿名类型,每一行都包含你要求的数据。如果每个主题只有一个分数,您可以替换Sum为。SingleOrDefault

var subjects = 
    objMarkCollection
    .Select(mark => mark.SubjectName)
    .Distinct()
    .Dump();

var q =  
    objStudentCollection 
    .GroupJoin( 
        objMarkCollection, 
        stu => stu.StudentID, 
        mark => mark.StudentID, 
        (stu, mark) => 
            new 
            { 
                student.StudentID, 
                student.StudentName, 
                Marks = 
                    from s in subjects
                    join m in mark on s equals m.SubjectName into outer
                    from o in outer.DefaultIfEmpty()
                    select new
                    {
                        SubjectName = s,
                        Score = (o == null) ? 0 : Convert.ToInt32(o.Score),
                    },
                Total = mark.Sum(m => Convert.ToInt32(m.Score)), 
            }) 
    .Dump();

第二个解决方案将为每个学生创建一个匿名类型,并为每个学生创建一个包含每个科目的分数集合(学生未参加的分数为 0)。

于 2011-12-04T23:50:51.550 回答