【问题标题】:Mongo C# Driver - How to apply ToLower() to a DistinctAsycMongo C# 驱动程序 - 如何将 ToLower() 应用于 DistinctAsyc
【发布时间】:2019-04-03 22:30:01
【问题描述】:

我正在使用 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);

【问题讨论】:

  • 它给了我这个错误:Unable to determine the serialization information for o =&gt; o.CreatedBy.ToString().ToLower()

标签: c# mongodb mongodb-.net-driver


【解决方案1】:

您可以采取多种方法来产生您想要的结果。有些是:

  1. 仅以小写形式存储作者的姓名(或至少以一致的方式存储,这样您就不必首先转换他们的姓名以在其中产生不同的姓名),在这种情况下,单独一个不同的查询足以让您获得想要的结果。

  2. 从当前数据中获取不同作者的姓名后,将他们的姓名映射到内存中各自的小写版本,然后对其应用另一个不同的函数,以获取所有作者的小写和不同形式的姓名。看起来像:

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();
  1. 使用聚合。基本上,您可以将所有作者的姓名project 转换为各自的小写形式(请参阅:toLower),然后将group 所有投影的小写名称转换为一组(请参阅:addToSet)。该集合将是您可以从聚合结果中提取的结果。

我的意见是,您应该考虑更改数据,以免增加不必要的计算复杂性,从而占用宝贵的资源。如果这不可能,但名称本身相对较少,则可以使用第二种方法。使用第三种方法时要理解它不是理想的,它会增加 DBMS 的更多处理。

【讨论】:

  • 您好!谢谢,我认为可以仅使用 MongoDB C# 驱动程序,但在步骤 2 中使用 LINQ 解决了问题。第 3 步是不必要的。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-24
  • 1970-01-01
相关资源
最近更新 更多