我试图做一个简单的“LIKE”查询使用LAMBDA表达式使用CreateDocumentQuery
;然而在尝试.Contains
和SqlMethod.Like
并且两次都收到回应NotImplementedException
我不知道下一步该怎么做!DocumentDB LAMBDA SqlMethod.Like和.Contains NotImplemented异常
回答
更新:作为5/6/15,DocumentDB添加一组字符串的功能,包括STARTSWITH
,ENDSWITH
,和CONTAINS
。请注意,大多数这些函数不会在索引上运行,并会强制执行扫描。
LIKE
和CONTAINS
尚未在DocumentDB中受支持。
您需要查看DocumentDB feedback page并对功能进行投票(例如LIKE和CONTAINS)才能听到您的声音!
因为我只需要搜索较大对象属性的谨慎子集,我实现了.Contains
搜索功能,如下所示。它按预期工作,但我不知道性能或可伸缩性。
领域模型
public interface ITaxonomySearchable
{
string Name { get; set; }
string Description { get; set; }
}
public class TaxonomySearchInfo : ITaxonomySearchable {
[JsonProperty(PropertyName = "id")]
public Guid Id { get; set; }
[JsonProperty(PropertyName = "name")]
public string Name { get; set; }
[JsonProperty(PropertyName = "description")]
public string Description { get; set; }
}
public class TaxonomyContainer : ITaxonomySearchable
{
[JsonProperty(PropertyName = "id")]
public Guid Id { get; set; }
[JsonProperty(PropertyName = "userId")]
public string UserId { get; set; }
[JsonProperty(PropertyName = "name")]
public string Name { get; set; }
[JsonProperty(PropertyName = "description")]
public string Description { get; set; }
[JsonProperty(PropertyName = "tags")]
public string[] Tags { get; set; }
[JsonProperty(PropertyName = "taxonomy")]
public Node[] Taxonomy { get; set; }
}
搜索方法
public async static Task<List<TaxonomySearchInfo>> Search(string searchTerm)
{
var db = GetJsonDocumentDb.GetDb();
using (var client = GetJsonDocumentDb.GetClient())
{
var documentCollection = await GetJsonDocumentDb.GetDocumentCollection(db, client, "TaxonomyContainerCollection");
return client.CreateDocumentQuery<TaxonomySearchInfo>(documentCollection.DocumentsLink)
.AsEnumerable()
.Where(r => r.Name.Contains(searchTerm) || r.Description.Contains(searchTerm))
.ToList();
}
}
您的搜索方法中的查询看起来好像它会通过UDF从集合中传递具有名称或说明属性的每个文档 - 这可能会花费很多,具体取决于集合中符合此条件的文档数量。您可以尝试分解查询(一个用于名称,另一个用于描述)并合并;并尽可能在where子句中添加任何其他过滤器/提示。尝试运行查询并确保在x-ms-request-charge头中使用的RU的数量是可以接受的。 – 2014-11-10 18:45:42
有一个相当不错的工具,名为DocumentDB Studio,它可以很容易地尝试查询和检查响应/头文件...链接:https://github.com/mingaliu/DocumentDBStudio/releases – 2014-11-10 18:48:05
非常感谢您阅读本文,关于DocumentDB工作室的小贴士 - 非常感谢! – bUKaneer 2014-11-11 09:37:43
- 1. DocumentDB的语法CONTAINS
- 2. Lambda Expression“Contains”
- 3. ProcessBuilder抛出异常:Arguement contains =
- 4. Lambda Expression + IEnumerable + C#+ Where + Contains
- 5. 捕获异步lambda异常
- 6. 捕捉lambda异常
- 7. 使用DateTimeOffset更新Azure表TableEntity抛出NotImplemented异常
- 8. 可以在虚拟方法中抛出NotImplemented异常吗?
- 9. Azure documentDB-id冲突不抛出异常
- 10. 在查询documentDB时抑制异常
- 11. EF linq/lambda .contains(list [String])?
- 12. lambda表达式和异常处理
- 13. 异常的谓词引起CONTAINS
- 14. Java:捕捉lambda异常
- 15. C++ lambda自传异常
- 16. 爪哇地图Lambda异常
- 17. contains和containstable之间的显着差异?
- 18. map.keySet()。contains()和map.containsKey()之间的差异
- 19. C#在多个属性上的Lambda .Contains()
- 20. 同档vs异构documentdb
- 21. Java8 LAMBDA反序列化ClassCastException异常
- 22. 如何使用python lambda捕获异常
- 23. lambda中的异常处理表达式
- 24. 瓶和mimerender异常处理
- 25. IOException异常和FileNotFoundException异常
- 26. NullPointerException异常和NoSuchElementException异常
- 27. 天青DocumentDB,在SP,setTimeout的抛出异常
- 28. 天青DocumentDB存储过程的异常不被抓住
- 29. 针对事件和绑定异常的一次性lambda
- 30. Java:.contains和.equals
感谢您的信息,我已经和投票,但我猜那些没有被异常的支持。我问是否有任何其他的方式来绕过它,而不是把整个集合拉到客户端,并在那里过滤。 – bUKaneer 2014-11-07 03:15:27
根据您处理的日期大小而定 - 一种潜在的解决方法是创建UDF以过滤服务器端的查询结果。这个警告是UDFs有限的执行时间,并没有利用指数;您将希望避免大扫描(尽可能过滤对索引值的查询)并限制传递给UDF的数据量。 – 2014-11-07 23:15:58
请将您的注意力放在我的解决方案上,也许您会反馈您是否认为这是一个合理的解决方案,而不是UDF方法? – bUKaneer 2014-11-08 01:23:56