linq CosmosDB C# SDK中不区分大小写的字符串搜索

slsn1g29  于 12个月前  发布在  C#
关注(0)|答案(5)|浏览(122)

我正在尝试使用C# Cosmos SDK v3.11.0执行不区分大小写的搜索。通过阅读CosmosDB blog post,SQL API现在支持这一点--但我无法使用SDK使其工作。The release notes for 3.10.0建议支持此功能,但我找不到任何关于如何使用它的文档。
我尝试了以下代码,但它不执行不区分大小写的搜索:

query.Where(d => d.Name.Contains(name, StringComparison.InvariantCultureIgnoreCase));

使用以下代码会导致引发异常:

query.Where(d => d.Name.StartsWith(name, StringComparison.InvariantCultureIgnoreCase))
Microsoft.Azure.Cosmos.Linq.DocumentQueryException: Method 'StartsWith' is not supported., Windows/10.0.18363 cosmos-netstandard-sdk/3.11.2
   at Microsoft.Azure.Cosmos.Linq.BuiltinFunctionVisitor.Visit(MethodCallExpression methodCallExpression, TranslationContext context)
   at Microsoft.Azure.Cosmos.Linq.StringBuiltinFunctions.Visit(MethodCallExpression methodCallExpression, TranslationContext context)
   at Microsoft.Azure.Cosmos.Linq.BuiltinFunctionVisitor.VisitBuiltinFunctionCall(MethodCallExpression methodCallExpression, TranslationContext context)
   at Microsoft.Azure.Cosmos.Linq.ExpressionToSql.VisitNonSubqueryScalarExpression(Expression inputExpression, TranslationContext context)
   at Microsoft.Azure.Cosmos.Linq.ExpressionToSql.VisitNonSubqueryScalarExpression(Expression expression, ReadOnlyCollection`1 parameters, TranslationContext context)
   at Microsoft.Azure.Cosmos.Linq.ExpressionToSql.VisitScalarExpression(Expression expression, ReadOnlyCollection`1 parameters, TranslationContext context)
   at Microsoft.Azure.Cosmos.Linq.ExpressionToSql.VisitScalarExpression(LambdaExpression lambda, TranslationContext context)
   at Microsoft.Azure.Cosmos.Linq.ExpressionToSql.VisitWhere(ReadOnlyCollection`1 arguments, TranslationContext context)
inb24sb2

inb24sb21#

对您编写的语法的支持目前在works中。一个pull request刚刚启动了a couple of hours ago
在此之前,下面的查询可以在当前的SDK版本(3.11)上运行,但它们也应该可以在旧版本上运行。应将其视为不区分大小写的解决方法。RU成本高于本地不区分大小写搜索。我做了一个快速测试,ToLower().StartsWith(...)的成本几乎是SQL等价物成本的两倍。

string mySearchStringLowered = name.ToLower();
//...
query.Where(d => d.Name.ToLower() == mySearchStringLowered);
query.Where(d => d.Name.ToLower().StartsWith(mySearchStringLowered));
zf9nrax1

zf9nrax12#

StringEquals在SDK中尚不支持(尚未)。我发现Cosmos DB团队中有人发来的消息证实了这一点(并指出沟通可能会更好)。
我还发现它在模拟器中也不支持。

rmbxnbpk

rmbxnbpk3#

SDK 3.12.0中明确支持不区分大小写:

string searchTerm = "do something";
var query = container.GetItemLinqQueryable<ToDoItem>();

query.Where(t => t.Description.StartsWith(searhTerm, StringComparison.InvariantCultureIgnoreCase));

将成功运行,并返回结果,其中Description以“Do Something”或“do something”开头。

flvtvl50

flvtvl504#

这不是正确的语法。请参阅文档here

3duebb1j

3duebb1j5#

Equals也很好用(至少在3.31.2版中):

query.Where(t => t.Description.Equals(searhTerm, StringComparison.InvariantCultureIgnoreCase));

相关问题