IQueryable排除列重复但保留所有空值

时间:2018-02-16 12:57:06

标签: c# linq entity-framework-core

您好我正在构建查询以从数据库中获取产品,首先我动态对其进行排序,然后我需要根据需要排除重复项的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);

1 个答案:

答案 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));