2017-03-27 43 views
0

我有一个拥有大量文档的DocumentDB集合。其中一些是无效的。我试图根据某些条件异步检索文档。在查询documentDB时抑制异常

下面代码抛出异常时,它创立一个无效的文件,该文件satifies条件,但不能被映射到TEntity(例如:某些字段是null):

IDocumentQuery<TEntity> queryable = client.CreateDocumentQuery<TEntity>(documentCollectionUri) 
               .Where(c=>c.Name!="raju").AsDocumentQuery(); 

       List<TEntity> resultList = new List<TEntity>(); 
       while (queryable.HasMoreResults) 
       { 
        foreach (TEntity t in await queryable.ExecuteNextAsync<TEntity>()) //throws exception while parsing to TEntity 
        { 
         resultList.Add(t); 
        } 
       } 

我可以FeedOptions参数设置为1然后把try catch在foreach循环中,但这不是有效的方法(这么多的调用)。

任何方法来抑制异常并获取所有匹配的文档?

+0

我认为这取决于引发异常的位置,是否有可能在迭代它们之前检测到无效文档? –

回答

0

使用非通用CreateDocumentQuery和文档转换为TEntity自己:

IDocumentQuery<TEntity> queryable = client.CreateDocumentQuery(documentCollectionUri) 
    .Where(c=>c.Name!="raju") 
    .Select(e => e as TEntity) // or whatever it takes to convert to TEntity without throwing 
    .Where(e => e != null) 
    .AsDocumentQuery(); 
+0

尝试过,现在不支持“一元运算符'类型'。” select()的错误 – JerryGoyal

0

使用CreateDocumentQuery <T>重载需要SqlQuerySpec和使用SqlQuerySpec过滤掉无效文件。沿着这些方向的东西:

var query = new SqlQuerySpec("SELECT * FROM Documents d WHERE IS_DEFINED(d.property)"); 

IDocumentQuery<TEntity> queryable = 
    client.CreateDocumentQuery<TEntity>(documentCollectionUri, query) 
      .Where(c=>c.Name!="raju") 
      .AsDocumentQuery(); 
+0

我无法控制对象的属性,所以不能使用IS_DEFINED(d.property)。无论属性如何,它都应该是通用的。 – JerryGoyal

0

SDK使用Json.Net在内部进行反序列化。您是否尝试用NullValueHandling JsonProperty包装您的不可空属性?

[JsonProperty(NullValueHandling = NullValueHandling.Ignore)] 
public int? MyNotNullable { get; set; } 
+0

嗯..这可以解决问题,但后来我必须用这个装饰所有属性。 – JerryGoyal

+0

只有那些你知道打破反序列化,而不是全部,你的查询代码仍然是通用的。 –