我正在使用DistinctAsync
从MongoDB检索字符串列表。问题是结果是不同的,除了我得到一些值都是大写的,有些是小写的,当然算作不同的。
如何将.ToLower()
应用于此查询?
public async Task<List<string>> GetAllAuthorsUserNames()
{
var filter = Builders<Episode>.Filter.Where(x => x.CreatedBy != null);
var cursor = await GetCollection().DistinctAsync(o => o.CreatedBy, filter);
return cursor.ToList();
}
我已经试过这个,但它不起作用:
var cursor = await GetCollection().DistinctAsync(o => o.CreatedBy.ToLower(), filter);
您可以采取多种方法来产生您想要的结果。有些是:
仅以小写形式存储作者的姓名(或至少以一致的方式存储,以便您不必首先转换他们的名字以产生不同的姓名),在这种情况下,仅一个不同的查询就足以获得所需的结果。
从当前数据中获取不同作者的姓名后,将其姓名映射到内存中各自的小写版本,然后对其应用另一个不同的函数,以小写和不同形式获取所有作者的姓名。这将看起来像:
var filter = ...
var cursor = await GetCollection().DistinctAsync(v => v.CreatedBy, filter);
var list = await cursor.ToListAsync();
var names = list.Select(v => v.ToLower()).Distinct().ToList();
- 使用聚合。基本上,您可以将所有作者的姓名
project
为各自的小写形式(请参阅:toLower),然后将所有投影的小写名称group
为一组(请参阅:addToSet)。该集合将是您可以从聚合结果中提取的结果。
我的观点是,您应该考虑更改数据,以免增加不必要的计算复杂性,从而占用宝贵的资源。如果这是不可能的,但名称本身相对较少,则可以使用第二种方法。使用第三种方法,并理解它不是理想的,它将增加DBMS方面的更多处理。