2016-03-05 87 views
1

有关此问题的快速问题。
我有一个错误无法从数据库中获取数据, EF Core或我的linq查询有问题吗?EF核心组在导航属性

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:序列包含多个元素

+1

你确定这是你的错误吗?这个错误是由Single或SingleOrDefault造成的 –

+0

很难推断问题出在哪里。查询似乎没问题。你可以请你的JobPostStatistics显示你的代码吗? –

+0

查询当你尝试.list或.singleordefault它遇到错误invalidoperatinexception所以认为它是错误的核心? – tomato45un

回答

0

在这里,你已经通过使用包括关键字启用预先加载。您尝试使用禁用延迟加载

+0

我说它“Ef核心”,渴望加载不支持在EF核心,为什么我需要使用。包括导航属性 – tomato45un

+0

如果您使用包括您启用急切加载 –

0

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

这里有人发布了与另一个GroupBy查询相同的错误。 https://github.com/aspnet/EntityFramework/issues/4775

我有GroupBy和包含()的另一个错误。由于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。

0

EF Core 2.1不仅会的工作,但它也将能够翻译GroupBy到SQL GROUP BY的。预计发布日期为Q4 2017。以前的版本也支持GroupBy,但在客户端执行它,如果您使用它从数据库中检索聚合,例如SUM,这可能是一个巨大的问题。 想象一下,从服务器检索200万行来计算客户端的总和,而不是直接从数据库服务器中获取。同时,您可以使用DbSet.FromSql编写自己的SQL查询并将其映射到实体或匿名类型,即调用FromSql作为您的上下文的实体集合的成员。