如何编写一个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和截止日期。我的查询有什么问题?
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
为每个Student
的LstDemerits
中的每个Demerits
创建了四个额外的列(每个字段一个列)。这可能行得通。但是,如果Demerits
是由多个老师分配的,那么TeacherID
字段本身就是一个List
呢?然后GridView
可能会为这个内部对象列表中的每个TeacherID
添加额外的列。一般来说,这很快就会变得站不住脚。
给出了这个问题的答案。另一个解决方案是在代码中自己构建一个DataTable
,这样就可以正确地显示对象。也许最简单的解决方案是将List<Student>
对象推入List<Dictionary<string, string>>
, key
s是字段名,value
s是来自类的数据,Student
的LstDemerits
中的每个Demerits
对象都有额外的key
- value
对。然而,如果你想对你的网页做任何事情,而不是显示你的信息,这种方法有明显的缺点。
在我看来,这个信息可以通过一个辅助页面来更好地表示——主页面显示每个Student
以及它们拥有的Demerits
的数量,在主页面上选择Student
会将您带到一个显示所有Student
的Demerits
的辅助页面。
也许您应该尝试过滤所有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;
这样你应该避免空列表,那可能是你最后的问题。我希望这对你有帮助