0

这真的阻碍了这个过程。我有一个存储为短标记的数据库,并且想要提取一个条目并在其上创建摘要统计信息。这看起来很简单,但我似乎必须跳过很多圈才能得到它,所以一定缺少一些基本的东西。

这是基本方法,这很有效。但是我能做的就是将它传递给 DataGridView。

    private void MarksSummary(string StudentID)
        {
        int ID = Convert.ToInt32(StudentID);
        //get the average of the marks using entity
        using (var context = new collegestudentsEntities1())
        {
            var StudentMarks = (from m in context.Marks
                                where m.StudIDFK == ID
                                select new
                                {
                                    m.Marks1,
                                    m.marks2,
                                    m.Marks3,
                                    m.Marks4
                                });
   dataGridView1.DataSource = StudentMarks.ToList();

其他任何事情,似乎都是可笑的长篇大论。

例如:我不能这样做

  var Marklist = new List<Int16>();
  StudentMarks.ToList().ForEach(m => Marklist.Add(m));

当我得到“无法从 'AnonymousType#1' 转换为 'short'”

或这个

   Marklist = StudentMarks.ToList();

或这个

 double av = Marklist.Average();

然而我可以在一行数据上做一个愚蠢的 forEach

     foreach (var s in StudentMarks)
                {
                    Marklist.Add(s.Marks1);
                   Marklist.Add(s.marks2);
                    Marklist.Add(s.Marks3);
                    Marklist.Add(s.Marks4);
                }

这可以愉快地输出

            txtMarksOverFifty.Text = Marklist.Count(s => s > 50).ToString();
            txtMarksFailed.Text = Marklist.Count(s => s < 50).ToString();

那么我缺少什么来轻松地从查询中获取值?

谢谢你的帮助 :-)

4

2 回答 2

2

foreach正在尝试添加匿名类型

select new
{
    m.Marks1,
    m.marks2,
    m.Marks3,
    m.Marks4
} //...

List<Int16>因此,失败也就不足为奇了。你想要做的是:

StudentMarks.ToList().ForEach(m => Marklist.AddRange(new [] { m.Marks1, m.marks2, m.Marks3, m.Marks4 }));

编辑:如果您只是在寻找代码更少的解决方案,您可以尝试:

using (var context = new collegestudentsEntities1())
{
    var StudentMarks = (from m in context.Marks
                        where m.StudIDFK == ID
                        select new[]
                        {
                            m.Marks1,
                            m.marks2,
                            m.Marks3,
                            m.Marks4
                        }).SelectMany(mark => mark).ToList();
}

或者简单地说:

    List<Int16> Marklist = context.Marks.Where(mark => mark.StudIDFK == ID)
        .SelectMany(m => new [] { m.Marks1, m.marks2, m.Marks3, m.Marks4 })
        .ToList();
于 2013-10-01T21:26:17.633 回答
1

看看你在这里创造了什么:

select new
{
   m.Marks1,
   m.marks2,
   m.Marks3,
   m.Marks4
});

这是一个包含短裤的对象。

StudentMarks.ToList().ForEach(m => Marklist.Add(m));

在这里,您尝试将对象添加到短裤列表中。尝试:

StudentMarks.ToList().ForEach(m => {
Marklist.Add(m.Mark1);
Marklist.Add(m.Mark2);
Marklist.Add(m.Mark3);
Marklist.Add(m.Mark4);

});

于 2013-10-01T21:25:21.973 回答