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