C# 实体框架核心GroupBy-相关实体上的聚合函数

C# 实体框架核心GroupBy-相关实体上的聚合函数,c#,entity-framework,linq,entity-framework-core,C#,Entity Framework,Linq,Entity Framework Core,在EF Core中,当使用GroupBy时,我无法让聚合函数处理来自相关实体的字段。下面是一个例子来说明我的意思: 我正在尝试运行以下查询: var list = db.Loans .GroupBy(x => x.Book.Isbn) .Select( x => new LoanQueryResult { Isbn = x.Key, AverageAge = x.Average(y => y.Member.

在EF Core中,当使用GroupBy时,我无法让聚合函数处理来自相关实体的字段。下面是一个例子来说明我的意思:

我正在尝试运行以下查询:

var list = db.Loans
   .GroupBy(x => x.Book.Isbn)
   .Select(
      x => new LoanQueryResult
      {
         Isbn = x.Key,
         AverageAge = x.Average(y => y.Member.Age)   // note here that I am navigating to a related entity
      }
   )
   .ToList();
因此,上述查询的目标是,对于每本Isbn图书,我需要借阅该书的会员的平均年龄

实体框架核心返回的错误如下:

The LINQ expression '(EntityShaperExpression: 
    EntityType: Loan
    ValueBufferExpression: 
        (ProjectionBindingExpression: EmptyProjectionMember)
    IsNullable: False
).Member.Age' could not be translated. Either rewrite the query in a form that can be translated, or switch to client evaluation explicitly by inserting a call to either AsEnumerable(), AsAsyncEnumerable(), ToList(), or ToListAsync(). See https://go.microsoft.com/fwlink/?linkid=2101038 for more information.
假设查询需要从Loans表开始,我如何才能使其工作?

这是我的模型(如果有帮助):

公共课堂教材
{
公共int Id{get;set;}
公共字符串Isbn{get;set;}
公共字符串标题{get;set;}
公共IList贷款{get;set;}
}
公共班级成员
{
公共int Id{get;set;}
公共字符串名{get;set;}
公共字符串姓氏{get;set;}
公共整数{get;set;}
公共IList贷款{get;set;}
}
公共类贷款
{
公共int Id{get;set;}
public int BookId{get;set;}
public int MemberId{get;set;}
公共日期时间起始日期{get;set;}
公共日期时间结束日期{get;set;}
公共图书{get;set;}
公共成员成员{get;set;}
}

我会在GroupBy之前取消规范化

var list = db.Loans
.Select(x => new
{
    x.Book.Isbn,
    x.Member.Age
}
.GroupBy(x => x.Isbn)
.Select(
  x => new LoanQueryResult
  {
      Isbn = x.Key,
      AverageAge = x.Average(y => y.Age)  
      }
)
.ToList();
var list = db.Loans
.Select(x => new
{
    x.Book.Isbn,
    x.Member.Age
}
.GroupBy(x => x.Isbn)
.Select(
  x => new LoanQueryResult
  {
      Isbn = x.Key,
      AverageAge = x.Average(y => y.Age)  
      }
)
.ToList();