Linq to Sql NotSupportedException "查询中实体的显式构造是无效的"
本文关键字:quot 无效 Sql to NotSupportedException 查询 Linq 实体 | 更新日期: 2023-09-27 18:01:54
我试图从一个Linq查询作为分组和平均从分组结果值后的结果不同的数据类型。
例如:我有一个名为grades的表,它有这些列:
long StudentID
long ExamID
int Grade
和另一个名为examAverage的表具有类似的结构:
long ExamID
int Grade
现在我要选择成绩表中的所有行,并按ExamID对它们进行分组。然后计算成绩的平均值,并将每个考试的结果保存在表examAverage中。
我没有的查询看起来像这样
var values = (from grades in db.Grades
group grades by grades.ExamID into avgGrade
select new examAverage
{
ExamID = avgGrade.Key,
Grade= (int)avgGrade.Average(x => x.Grade)
});
不幸的是,总是抛出一个System。NotSupportedException告诉我,我不允许构造一个新的实例的Entitytype examAverage。但是,当我将数据库交换为成绩列表并将结果存储在类型为examAverage的列表中时,它工作得很好。
现在来回答我的问题。有可能做到这样的事情吗?怎么做?如果没有,有没有其他类似的方法?你的问题可能是"examAverage"也是一个Linq实体:它映射到一个表或视图。
Linq to Objects不检查这个,所以这就是为什么你在查询对象列表时不会得到异常。Linq to SQL DOES,部分原因是它想保护您避免意外创建大量包含数据的实体,这些实体包含的数据不反映您的实际数据库状态。
所以你能做什么取决于你想做什么:
如果你想获得在数据库查询中构造的自定义对象列表,使用不同的类型,例如MyExamAverage -可能在另一个程序集中定义。
如果你真的想创建数据库记录(select…Into)可以使用匿名类型:
var values = (from grades in db.Grades
group grades by grades.ExamID into avgGrade
select new
{
ExamID = avgGrade.Key,
Grade= (int)avgGrade.Average(x => x.Grade)
});
foreach (var value in values)
{
var grade = new examAverage{
ExamID = value.ExamId,
Grade = value.Grade
};
// save grade here
}
如果你必须从一个方法返回列表,你可以:
private IEnumerable<examAverage> GetGrades()
{
var values = (from grades in db.Grades
group grades by grades.ExamID into avgGrade
select new
{
ExamID = avgGrade.Key,
Grade= (int)avgGrade.Average(x => x.Grade)
});
foreach (var value in values) yield return new examAverage{
ExamID = value.ExamId,
Grade = value.Grade
};
}