EF Core-如何通过多个联接按可为空的列分组

时间:2019-12-28 14:38:42

标签: c# linq entity-framework-core ef-core-2.2

给出了EF Core 2.2中的以下模型:

public class A
{
    public int Id { get; set; }
    public ICollection<B> Bs { get; set; }
}

public class B
{
    public int Id { get; set; }
    public int AId { get; set; }
    public ICollection<C> Cs { get; set; }
}

public class C
{
    public int Id { get; set; }
    public int BId { get; set; }
    public long? DId { get; set; }
}

public class D
{
    public long Id { get; set; }
}

我想执行此查询:

from a in context.Set<A>()
from b in a.Bs
from c in b.Cs
where c.DId.HasValue
group c by c.DId.Value into g
select new
{
    g.Key,
    Count = g.Count() - 1
}

但是当我尝试执行此操作时,我得到了:

  

LINQ表达式'GroupBy(Convert([b.Cs].DId, Int64), [b.Cs])'无法翻译,将在本地求值。

我已经引用了这些:

但是我似乎无法正确组成查询。在EF Core 2.2上可能吗?还是有更好的方法来获得我想要的结果?

1 个答案:

答案 0 :(得分:1)

编写查询的方式没有错。这只是EF Core 2.2查询翻译错误/缺陷之一,因为按c.DId分组有效,所以最终键类型为long?。同样在EF Core 3.1中,查询可以正确翻译。

2.2的解决方法是使用中间匿名类型对密钥进行分组,在该密钥中执行可空到不可空的“转换”。像这样:

group c by new { Value = c.DId.Value } into g
select new
{
    Key = g.Key.Value,
    Count = g.Count() - 1
}