LiteDB 查询中的字符串区分大小写
String case sensitive in LiteDB query
在各种环境下,用户名不区分大小写。我们查询 admin
等于 ADMIN
。我搜索了名为 CompareTo
的 LiteDB
来比较两个对象,但我找不到将字符串比较为不区分大小写的点。
代码在QueryEquals.cs
internal override IEnumerable<IndexNode> ExecuteIndex(IndexService indexer, CollectionIndex index)
{
var node = indexer.Find(index, _value, false, Query.Ascending);
if (node == null) yield break;
yield return node;
if (index.Unique == false)
{
// navigate using next[0] do next node - if equals, returns
while (!node.Next[0].IsEmpty && ((node = indexer.GetNode(node.Next[0])).Key.CompareTo(_value) == 0))
{
if (node.IsHeadTail(index)) yield break;
yield return node;
}
}
}
我们可以不区分大小写的命题
using (var db = new LiteRepository("lite.db"))
{
db.Insert(new User { Name = "John" });
var user = db.Query<User>()
.Where(x => x.Name == "JOHN")
.FirstOrDefault(); // proposal return John
var fail = db.Query<User>()
.Where(x => string.Equals(x.Name, "JOHN", StringComparison.OrdinalIgnoreCase))
.FirstOrDefault(); // throw exception
}
另一个考虑,是否可以在 LiteDB 中执行 lambda 表达式而无需访问者转换?
在LiteDB v4中,你可以使用表达式来确保用户名的索引存储为小写,然后你可以执行"lowercase-compare"
// Create index
entity.EnsureIndex(e => e.Username, "LOWER($.Username)");
...
// Find user
collection.Find(e => e.Username == username.ToLower);
如果您不想使用表达式,我想您可以在保存到 LiteDB 之前确保用户名是小写的,或者您可以使用 collection.Where(不太确定)来使用无索引查询(较慢)不过在那个方法上)。
在各种环境下,用户名不区分大小写。我们查询 admin
等于 ADMIN
。我搜索了名为 CompareTo
的 LiteDB
来比较两个对象,但我找不到将字符串比较为不区分大小写的点。
代码在QueryEquals.cs
internal override IEnumerable<IndexNode> ExecuteIndex(IndexService indexer, CollectionIndex index)
{
var node = indexer.Find(index, _value, false, Query.Ascending);
if (node == null) yield break;
yield return node;
if (index.Unique == false)
{
// navigate using next[0] do next node - if equals, returns
while (!node.Next[0].IsEmpty && ((node = indexer.GetNode(node.Next[0])).Key.CompareTo(_value) == 0))
{
if (node.IsHeadTail(index)) yield break;
yield return node;
}
}
}
我们可以不区分大小写的命题
using (var db = new LiteRepository("lite.db"))
{
db.Insert(new User { Name = "John" });
var user = db.Query<User>()
.Where(x => x.Name == "JOHN")
.FirstOrDefault(); // proposal return John
var fail = db.Query<User>()
.Where(x => string.Equals(x.Name, "JOHN", StringComparison.OrdinalIgnoreCase))
.FirstOrDefault(); // throw exception
}
另一个考虑,是否可以在 LiteDB 中执行 lambda 表达式而无需访问者转换?
在LiteDB v4中,你可以使用表达式来确保用户名的索引存储为小写,然后你可以执行"lowercase-compare"
// Create index
entity.EnsureIndex(e => e.Username, "LOWER($.Username)");
...
// Find user
collection.Find(e => e.Username == username.ToLower);
如果您不想使用表达式,我想您可以在保存到 LiteDB 之前确保用户名是小写的,或者您可以使用 collection.Where(不太确定)来使用无索引查询(较慢)不过在那个方法上)。