导航属性上的EF核心组

时间:2016-03-05 12:25:22

标签: entity-framework linq

有关此问题的快速提问。
我有一个错误无法从数据库中获取数据, EF Core或我的linq查询是否存在问题?

var query = _postRepository.Table
    .Where(x => x.Approval == true)
    .Include(p => p.Industry)
    .GroupBy(grp => new { grp.Industry.Id, grp.Industry.Name })
    .Select(s => new JobPostStatistics
    {
         IndustryId = s.Key.Id,
         IndustryName = s.Key.Name,
         TotalJobPost = s.Count()
    });

return query.Take(6).ToList();
  

InvalidOperationException:Sequence包含多个元素

4 个答案:

答案 0 :(得分:1)

似乎在EF RC1 GroupBy导致错误,这里报告错误:

GroupBy query cause error Sequence contains more than one element

答案 1 :(得分:0)

您可以使用include关键字启用预先加载。您尝试使用禁用延迟加载

答案 2 :(得分:0)

EF Core的服务器端GroupBy支持已推迟到发布后:https://github.com/aspnet/EntityFramework/issues/2341 当您记录EF创建的查询时,您可以看到它不会在SQL中创建GROUP BY。

此处其他人在另一个GroupBy查询中发布了相同的错误。 https://github.com/aspnet/EntityFramework/issues/4775

我在GroupBy和Include()中遇到了另一个错误。由于EF不支持SQL中的GroupBy,并且分组是在客户端完成的,因此我将查询拆分为服务器端部分和客户端部分。第一部分使用Include()从数据库查询到匿名类型。然后我在客户端进行分组。

var event2Country = DbContext.Event2Countries
    .Include(j => j.Location)
    .Select(j => new { j.Location.Id, j.Location.Name })
    .AsNoTracking();
viewModel.MostUsedCountries = event2Country
    .GroupBy(j => new { j.Id, j.Name })
    .OrderByDescending(j => j.Count())
    .ThenBy(j => j.Key.Id)
    .Select(j => new SimpleListCountViewModel()
    {
        Id = j.Key.Id,
        Name = j.Key.Name,
        Count = j.Count()
    })
    .Take(15)
    .ToList();

目前,如果您拥有大量数据,则无法在EF Core中使用GroupBy。解决方法是使用FromSql。请参阅Github上的问题4959。

答案 3 :(得分:0)

EF Core 2.1不仅有效,而且还能够将GroupBy转换为SQL GROUP BY。预计发布日期为Q4 2017。以前的版本也支持GroupBy,但在客户端执行它,如果您正在使用它从数据库中检索聚合(如SUM),这可能是一个很大的问题。 想象一下,从服务器检索200万行以计算客户端的总和,而不是直接从数据库服务器获取

与此同时,您始终可以使用DbSet.FromSql编写自己的SQL查询并将其映射到实体或匿名类型,即调用FromSql作为上下文的实体集合的成员。