这确实阻碍了这个过程。 我有一个存储为short的标记数据库,并希望提取单个输入并在其上创建摘要统计信息。这似乎很简单,但我似乎必须跳过大量的箍才能得到它所以必须缺少一些基本的东西。
这是基本方法,这很有效。但是我能用它做的就是把它传递给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();
那么我错过了什么来轻松地从查询中获取值?
感谢您的帮助: - )
答案 0 :(得分: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();
答案 1 :(得分: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);
} );