2017-07-26 66 views
1

propertiers列表使用Azure的DocumentDb和.NET API,我有以下的方法,用於檢索整個文檔的列表的偉大工程:查詢DocumentDB的使用LINQ的選擇

public async Task<IEnumerable<T>> GetItemsAsync<T>(Expression<Func<T, bool>> predicate) 
    {    
     IDocumentQuery<T> query = _Client.CreateDocumentQuery<T>(
      UriFactory.CreateDocumentCollectionUri(_DatabaseId, _Collection), 
      new FeedOptions { MaxItemCount = -1 }) 
      .Where(predicate) 
      .AsDocumentQuery(); 

     List<T> results = new List<T>(); 
     while (query.HasMoreResults) 
     { 
      var item = await query.ExecuteNextAsync<T>(); 
      results.AddRange(item); 
     } 

     return results; 
    } 

現在,我不知道總是希望回到整個文檔(尤其是考慮到DocumentDb RU定價模型),所以我想我應該能夠添加。選擇投影像這樣:

public async Task<List<TResult>> GetItemsAsync<T, TResult>(Expression<Func<T, bool>> predicate, Expression<Func<T, TResult>> select) 
     { 
      IDocumentQuery<TResult> query = _Client.CreateDocumentQuery<T>(
       UriFactory.CreateDocumentCollectionUri(_DatabaseId, _Collection), 
       new FeedOptions { MaxItemCount = -1 }) 
       .Where(predicate) 
       .Select(select) 
       .AsDocumentQuery(); 

      List<TResult> results = new List<TResult>(); 
      while (query.HasMoreResults) 
      { 
       var item = await query.ExecuteNextAsync<TResult>(); 
       results.AddRange(item); 
      } 

      return results; 
     } 

用法:

var rez = await _docs.GetItemsAsync<ApolloAssetDoc, Guid?>(x => x.MyVal == 5, x => x.ID); 

但第二種方法總是返回0結果。很明顯,我正在吠叫錯誤的樹。

任何想法什麼正確的方式來返回一個選擇多個屬性的查詢(例如"SELECT d.id, d.MyVal FROM Items d WHERE d.DocType=0")的動態對象的列表或只有一個屬性被選中的簡單列表(例如"SELECT d.id FROM Items d WHERE d.DocType=0")?

回答

1

我可以重現問題,如果沒有[JsonProperty(PropertyName = "id")]ID屬性在實體類。如果不包含,請試試用下面的代碼:

public class ApolloAssetDoc 
    { 
     [JsonProperty(PropertyName = "id")] 
     public Guid ID { get; set; } 
     public string MyVal { get; set; } 

    } 

注意:本場是區分大小寫

+0

有趣!我確實定義了該屬性,但是我在「ICosmosDocument」文檔界面中定義了它。我沒有意識到JsonProperty映射屬性不能應用在界面中!可能適用於任何屬性?感謝您的協助! –