您好我正在构建查询以从数据库中获取产品,首先我动态对其进行排序,然后我需要根据需要排除重复项的ProductGroupId
属性来检索产品,然后我将其分页。问题是我不知道如何在保持空值和排序完整的情况下正确排除重复项。
Id ProductGroupId
-------------
1 null
2 null
3 2
4 1
5 2
6 null
7 1
8 null
查询应返回6条记录,不包括产品5和7,因为它们的ProductGroupId将它们标记为重复记录。
query = query.OrderBy(input.Sorting);
if (input.Sorting != "Price")
{
query = // query.GroupBy or something ... ?
}
query = ApplyPaging(query, input);
var entities = await AsyncQueryableExecuter.ToListAsync(query);
答案 0 :(得分:0)
我的一个要求是出于性能原因避免过早ToList()
。我已使用Union
完成了所需的过滤,但Concat
也可以使用。
query = query.Where(x => x.ProductGroupId == null)
.Union(query.Where(x => x.ProductGroupId != null).GroupBy(x => x.ProductGroupId).Select(x => x.First()));
值得注意的是,EntityFrameworkCore目前存在陷阱,其中某些Concat / Union场景导致Issue #11007跟踪 ArgumentNullException
如果要反转链条,则会抛出异常
query = query.Where(x => x.ProductGroupId != null).GroupBy(x => x.ProductGroupId).Select(x => x.First())
.Union(query.Where(x => x.ProductGroupId == null));