【问题标题】:Linq Error: Average could not be translatedLinq 错误:无法翻译平均值
【发布时间】: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。

标签: c# asp.net linq


【解决方案1】:

使用 Covert.ToInt32() 而不是 int.Parse() 可以消除错误。谢谢 Random12b3 和 Svyatoslav Danyliv。

【讨论】:

    【解决方案2】:

    只有将 ToList() 调用移到 Select 调用之前,才能实现您想要实现的目标。这样做的原因是因为您试图在实际从数据库中检索标记之前将其从字符串转换为 int。以下代码很可能会起作用:

    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)
        .ToList()
        .Select(g => new Stats
        {
            Name = g.Key,
            Avg = g.Average(s => int.Parse(s.Mark))
        });
    

    【讨论】:

    • 它给了我这个错误:InvalidOperationException:无法翻译给定的“GroupBy”模式。在“GroupBy”之前调用“AsEnumerable”以在客户端对其进行评估。
    • 尝试使用 AsEnumerable() 代替 ToList()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-10
    • 1970-01-01
    • 2021-06-23
    • 2020-10-26
    • 2022-10-20
    • 2022-11-11
    • 2021-12-28
    相关资源
    最近更新 更多