EF Core 2.2的GroupBy FirstOrDefault的替代

时间:2019-11-19 11:57:22

标签: c# linq .net-core

在我的项目中,以下LINQ查询目前存在问题:

context.WebPages.GroupBy(x => x.Url).Select(x => new { x.Key, x.FirstOrDefault()?.LogoId } ).ToList();

基本上,我正在尝试从我们的数据库Web页面中获取它们的URL和分配给它们的第一个徽标ID。但是,我在警告语中苦苦挣扎:The LINQ expressio could not be translated and will be evaluated locally.因为我要存储数百万个网页,所以我不想加载不必要的数据。而且我绝对不希望在本地对表达式进行求值。

我已经尝试了LINQ表达式的几种优化,例如:

context.WebPages.GroupBY(x => x.Url, x => new {x.LogoId}).Select(x => new { x.Key, x.FirstOrDefault()?.LogoId } ).ToList();
context.WebPages.GroupBy(x => x.Url).Select(x => new { x.Key, x.First().LogoId } ).ToList();
context.WebPages.GroupBy(x => x.Url).Select(x => x.First()).ToList();
context.WebPages.GroupBy(x => x.Url).ToList();

但是我总是以同样的警告告终。唯一可以翻译的查询(但对我没有用)是:

context.WebPages.GroupBy(x => x.Url).Select(x => x.Key).ToList();

是否有任何可行的替代LINQ表达式(甚至是一组LINQ表达式)?还是我需要使用普通的SQL表达式?

侧面说明:我们还计划迁移到.NET Core 3.0,但这距离未来还有几个月的时间……而且我等不及要等到“那么”。

1 个答案:

答案 0 :(得分:0)

如果我们尝试排除联接该怎么办?假设LogoId是可比较的类型(例如int):

var ans = from a in context.WebPages
          where !(from b in context.WebPages where a.Url == b.Url && a.LogoId > b.LogoId select b).Any()
          select new {
              a.Url,
              a.LogoId
          };

更新:我用EF 2.2.6对此进行了测试,它生成了SQL罚款(可能效率低下)。

更新2:我也使用EF 3进行了测试,并且可以正常工作。我以前的Distinct / GroupJoin在EF 3中的SQL转换失败。