给出了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上可能吗?还是有更好的方法来获得我想要的结果?
答案 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
}