如何编写其答案包含列表的LINQ查询?

时间:2014-03-17 18:26:26

标签: c# linq list

我有StudentDB,它只是一个Student对象列表,定义为:

 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的降序排序,并查看所有学生的详细信息(如果他们有)(即TeacherID,AsOf,Description 1&amp; 2)。 / p>

这是我的查询,这并不是我想要的所有内容:

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&gt; 0,我没有看到LstDemerits中应该显示教师ID和截止日期的数据。我的查询出了什么问题?

3 个答案:

答案 0 :(得分:2)

LstDemerits属性未绑定到数据源,因为它是List<Demerits&gt;而不是字符串/ 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();

答案 1 :(得分:1)

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

作为this question的答案给出了一个解决方案。另一种解决方案是在您的代码中自己构建GridView,以便您可以正确显示对象。也许最简单的解决方案是将TeacherID对象推送到DataTable,其中List<Student>为字段名称,List<Dictionary<string, string>>为您班级的数据,附加{ {1}} key valuekey valueDemerits对。但是,如果您想对网页执行任何操作而不是显示信息,则此方法会带来明显的缺点。

在我看来,通过设置辅助页面可以更好地表示此信息 - 主页面显示每个Student以及他们拥有的LstDemerits个数,并选择Student在主页面上,您将转到显示所有Demerits Student的所有辅助页面。

答案 2 :(得分:0)

也许您应该尝试过滤所有拥有LstDemerits .Count&gt;的学生。 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;

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