c# - MongoDB c# 驱动程序 : Case Insensitive Compare using in or contains on a list using linq

标签 c# linq mongodb

我正在使用 MongoDB C# 驱动程序,我想在集合上执行一个 linq where 子句,将属性的小写版本与我在内存中的列表的小写版本进行比较。像这样;

items = items.Where(i => listToCheck.Contains(i.Property.ToLower()));

我也试过...

items = items.Where(i => i.Property.ToLower().In(listToCheck));

我认为这实际上是正确的并且应该有效,但可能尚未实现。

我收到一条错误消息,指出与 ToLower() 命令相关的“不受支持的 where 子句”。据我所知,驱动程序目前无法完成此操作,因为它必须使用 Regex 执行“IN”查询,而我认为这是不可能的。

我想知道是否可行,如果可行,怎么做?

最佳答案

我最终找到了这个问题的解决方案,经过大量挖掘后我发现 toLower() 方法没有在 mongoDb linq 提供程序中实现,所以我不得不改为使用 MongoQuery

我为字符串和列表创建了一些扩展方法,它将字符串或列表作为源并将其转换为 bson 正则表达式

internal static List<BsonValue> ConvertToCaseInsensitiveRegexList(this IEnumerable<string> source)
{
    return source.Select(range => new BsonRegularExpression("/^" + range.Replace("+", @"\+") + "$/i")).Cast<BsonValue>().ToList();
}

internal static List<BsonValue> ConvertToEndsWithRegexList(this IEnumerable<string> source)
{
    return source.Select(range => new BsonRegularExpression("/" + range.Replace("+", @"\+") + "$/i")).Cast<BsonValue>().ToList();
}

internal static BsonRegularExpression ToCaseInsensitiveRegex(this string source)
{
    return new BsonRegularExpression("/^" + source.Replace("+", @"\+") + "$/i");
}

然后他们像这样使用...

var colours = new List<string> { "Red", "blue", "white" };
var query = Query<myObject>.In(v => v.Colour, colours.ConvertToCaseInsensitiveRegexList());
this.Find(query).ToList();

关于c# - MongoDB c# 驱动程序 : Case Insensitive Compare using in or contains on a list using linq,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25745276/

相关文章:

c# - 如何在 C# 中将时间戳字符串转换为日期

c# - 如何在 WHERE 子句 (LINQ) 中使用 DateTime?

java - 如何使用文档和 mongo 聚合将 mongo shell 代码转换为 java 代码

arrays - MongoDB 数组 - 原子更新或推送元素

c# - 在 MVC 中使用 DBCONTEXT 类的正确方法

c# - 具有存储过程的 Visual Studio 数据集设计器?这个图标是什么

c# - 具有返回值和输出参数的 Python NET 调用 C# 方法

c# - Linq:如何对关联对象使用规范

.net - Crystal 报表和 LINQ

python - 无法导入 pymongo ubuntu