如何编写一个LINQ查询,其答案包含一个列表

本文关键字:答案 列表 包含一 查询 一个 何编写 LINQ | 更新日期: 2023-09-27 17:50:36

我有StudentDB,这只是一个学生对象的列表,它被定义为:

 public class Student
        {
            public String StudentID { get; set; }
            public int ExtraCredit { get; set; }
            public int QtyDemerits { get; set; }
            public List<Demerits> LstDemerits = new List<Demerits>();
        }
  public class Demerits
        {
            public String TeacherID { get; set; }
            public DateTime AsOf { get; set; }
            public String Description1 { get; set; }
            public String Description2 { get; set; }
        }

我想编译一个学生列表,按ExtraCredit降序排序,并查看所有学生的记过详细信息,如果他们有任何(即教师id, AsOf,描述1 &2) .

这是我的查询,它并没有完全得到我想要的一切:

List<Student> StudentDB2 = new List<Student>();
 StudentDB2 = StudentDB.OrderByDescending(x => x.ExtraCredit).Select(r => new Student
        {
            StudentID = r.StudentID,
            ExtraCredit = r.ExtraCredit,
            QtyDemerits = r.QtyDemerits,
            LstDemerits = r.Demerits.OrderBy(c => c.TeacherID).ThenBy(d => d.AsOf).ToList()
        })
        .ToList();
dataGridView1.DataSource = StudentDB2;

当我运行代码时,我只看到3列数据:StudentID, ExtraCredit和QtyDemerits。但是如果QtyDemerits> 0,我就看不到LstDemerits中的数据,LstDemerits应该显示教师Id和截止日期。我的查询有什么问题?

如何编写一个LINQ查询,其答案包含一个列表

LstDemerits属性没有被绑定到数据源,因为它是List<Demerits>而不是字符串/int等。

尝试将LstDemerits设置为如下字符串:

public class Student
{
    public String StudentID { get; set; }
    public int ExtraCredit { get; set; }
    public int QtyDemerits { get; set; }
    public string LstDemerits { get; set; }
}

然后编写自定义逻辑以正确地将List<Demerits>呈现为字符串。

StudentDB2 = StudentDB.OrderByDescending(x => x.ExtraCredit).Select(r => new Student
        {
            StudentID = r.StudentID,
            ExtraCredit = r.ExtraCredit,
            QtyDemerits = r.QtyDemerits,
            LstDemerits = CustomLogic(r.Demerits)
        })
        .ToList();

问题不在于您的查询,而在于您将查询绑定到的GridView。默认情况下,GridViews显示绑定到它们的对象的属性,但不能像List那样显示复杂的属性。这是合理的,因为试图将List显示为列会导致难以回答的问题。以您自己的对象为例:您将List<Student>绑定到GridView,然后假设GridView为每个StudentLstDemerits中的每个Demerits创建了四个额外的列(每个字段一个列)。这可能行得通。但是,如果Demerits是由多个老师分配的,那么TeacherID字段本身就是一个List呢?然后GridView可能会为这个内部对象列表中的每个TeacherID添加额外的列。一般来说,这很快就会变得站不住脚。

给出了这个问题的答案。另一个解决方案是在代码中自己构建一个DataTable,这样就可以正确地显示对象。也许最简单的解决方案是将List<Student>对象推入List<Dictionary<string, string>>, key s是字段名,value s是来自类的数据,StudentLstDemerits中的每个Demerits对象都有额外的key - value对。然而,如果你想对你的网页做任何事情,而不是显示你的信息,这种方法有明显的缺点。

在我看来,这个信息可以通过一个辅助页面来更好地表示——主页面显示每个Student以及它们拥有的Demerits的数量,在主页面上选择Student会将您带到一个显示所有StudentDemerits的辅助页面。

也许您应该尝试过滤所有LstDemerits .Count> 0的学生,例如:

List<Student> StudentDB2 = new List<Student>();
 StudentDB2 = StudentDB.Where(i => i.LstDemerits.Count > 0).OrderByDescending(x => x.ExtraCredit).Select(r => new Student
        {
            StudentID = r.StudentID,
            ExtraCredit = r.ExtraCredit,
            QtyDemerits = r.QtyDemerits,
            LstDemerits = r.Demerits.OrderBy(c => c.TeacherID).ThenBy(d => d.AsOf).ToList()
        })
        .ToList();
dataGridView1.DataSource = StudentDB2;

这样你应该避免空列表,那可能是你最后的问题。我希望这对你有帮助