【问题标题】:Querying DocumentDB for a list of propertiers using Linq's Select使用 Linq 的 Select 查询 DocumentDB 以获取属性列表
【发布时间】:2017-07-26 05:01:06
【问题描述】:

使用 Azure 的 DocumentDb 和 .NET API,我有以下方法非常适合检索整个文档的列表:

   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 定价模型),所以我认为我应该能够像这样添加一个 .Select 投影:

 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")的正确方法是什么?

【问题讨论】:

    标签: azure azure-cosmosdb nosql


    【解决方案1】:

    如果实体类中的 ID 属性没有[JsonProperty(PropertyName = "id")],我可以重现该问题。如果不包含,请尝试使用以下代码:

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

    注意:该字段区分大小写

    【讨论】:

    • 有趣!我确实定义了该属性,但我在“ICosmosDocument”文档界面中定义了它。没想到JsonProperty映射属性不能应用在界面中!可能适用于任何属性?感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多