MongoDB C# 驱动程序:使用 linq 在列表中使用或包含在列表中进行不区分大小写的比较

Tom*_*kin 4 c# linq mongodb

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

items = items.Where(i => listToCheck.Contains(i.Property.ToLower()));
Run Code Online (Sandbox Code Playgroud)

我也尝试过...

items = items.Where(i => i.Property.ToLower().In(listToCheck));
Run Code Online (Sandbox Code Playgroud)

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

我收到一条错误消息,提示与 ToLower() 命令相关的“不支持的 where 子句”。据我所知,驱动程序目前无法完成此任务,因为它必须使用正则表达式进行“IN”查询,而我认为这是不可能的。

我想知道是否可能,如果可以,如何实现?

Tom*_*kin 5

我最终找到了这个问题的解决方案,经过大量挖掘,我发现这些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");
}
Run Code Online (Sandbox Code Playgroud)

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

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