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的列表中时,它工作得很好。

现在来回答我的问题。有可能做到这样的事情吗?怎么做?如果没有,有没有其他类似的方法?

Linq to Sql NotSupportedException "查询中实体的显式构造是无效的"

你的问题可能是"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
    };
}