System.InvalidOperationException при использовании GroupBy - PullRequest
1 голос
/ 29 января 2020

У меня следующий запрос EntityFramework Core 3.1:

var counts = await postTags
  .GroupBy(x => x.Tag)
  .Select(x => new Model {
    Tag = new TagModel { 
      Id = x.Key.Id, 
      Name = x.Key.Name
    },
    PostCount = x.Count() 
  })
  .ToListAsync();

Где находятся объекты:

public class Tag {
  public Int32 TagId { get; set; }
  public String Name { get; set; } 
  public virtual Collection<PostTag> PostTags { get; set; } 
}

public class PostTag {
  public Int32 PostId { get; set; }
  public Int32 TagId { get; set; }
  public virtual Post Post { get; set; } 
  public virtual Tag Tag { get; set; } 
}

public class Post {
  public Int32 PostId { get; set; }
  public String Name { get; set; } 
  public virtual Collection<PostTag> PostTags { get; set; } 
}

Цель - подсчитать, сколько сообщений связано с каждым тегом.

Когда я запускаю запрос, я получаю следующую ошибку:

Exception thrown: 'System.InvalidOperationException' in System.Private.CoreLib.dll: 'The LINQ expression 'DbSet<PostTag>
    .Join(
        outer: DbSet<Tag>, 
        inner: j => EF.Property<Nullable<int>>(j, "TagId"), 
        outerKeySelector: s => EF.Property<Nullable<int>>(s, "Id"), 
        innerKeySelector: (o, i) => new TransparentIdentifier<PostTag, Tag>(
            Outer = o, 
            Inner = i
        ))
    .GroupBy(
        source: j => j.Inner, 
        keySelector: j => j.Outer)' 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().

Я что-то упустил?

1 Ответ

1 голос
/ 30 января 2020

Проблема в группе заключается в том, что Tag является свойством навигации, поэтому его нельзя использовать в качестве столбца. Чтобы исправить это, используйте TagId и Name из Tag nav. вместо этого prop - две колонки, которые, я думаю, вы хотите сгруппировать:

var counts = await postTags
  .GroupBy(x => new{ x.Tag.TagId, x.Tag.Name)
  .Select(x => new Model {
    Tag = new TagModel { 
      Id = x.Key.TagId, 
      Name = x.Key.Name
    },
    PostCount = x.Count() 
  })
  .ToListAsync();
...