【发布时间】:2021-10-09 10:41:58
【问题描述】:
public List<Stats> subjects = _context.Gradebooks
.Include(s => s.Student)
.Include(s=>s.Subject)
.Where(s => s.LessonDate >= startDate && s.LessonDate <= endDate && s.Student.GradeId == gradeId && s.Mark !="0")
.GroupBy(s=>s.Subject.Name)
.Select(g=> new Stats
{
Name = g.Key,
Avg = g.Average(s=>int.Parse(s.Mark)) //error
//Avg = g.Average(s => s.StudentId) //works
}).ToList();
处理请求时发生未处理的异常。 InvalidOperationException:LINQ 表达式 'GroupByShaperExpression: KeySelector: s.Name, ElementSelector:EntityShaperExpression:EntityType:成绩簿 ValueBufferExpression:ProjectionBindingExpression: EmptyProjectionMember IsNullable: False
.Average(s => int.Parse(s.Mark))' 无法翻译。任何一个 以可以翻译的形式重写查询,或切换到 通过插入对“AsEnumerable”的调用来显式评估客户端, “AsAsyncEnumerable”、“ToList”或“ToListAsync”。
我正在使用 Entity Framework Core 构建一个 asp.net 网站。谁能告诉我这个 linq 查询有什么问题?我收到有关平均功能的错误。当我尝试像 StudentId 这样的 Average 函数的其他愚蠢值时,一切正常。如果一切都失败了,我应该将数据库中的 nvarchar 字段设置为 int 吗?
我的实体:
成绩簿
身份证号
课程日期 datetime2(7)
马克 nvarchar(20)
学生 ID 整数
SubjectId 整数
TeacherId int
主题
身份证号
名称 nvarchar (50)
学生
GradeId int
(其他非相关属性)
统计类:
public class Stats
{
public string Name;
public double Avg;
}
【问题讨论】:
-
你试过
Covert.ToInt32()而不是int.Parse()吗?也许这可以解决您的问题。 -
不能在 Linq 中使用 Covert.ToInt32 到实体。
-
为什么不能在 LINQ to Entities 中使用
Convert.ToInt32?刚刚检查了 EF Core 源,他们已经为这个函数翻译了 SQL。 -
谢谢 Random12b3。我不知道如何将您的评论标记为正确答案。实际上,您可以在 linq to 实体中使用 Covert.ToInt32()。也感谢 Svyatoslav Danyliv。