【问题标题】:.Select is not supported in Microsoft.Azure.Documents.LinqMicrosoft.Azure.Documents.Linq 不支持 .Select
【发布时间】:2017-09-30 04:42:12
【问题描述】:

各位程序员们好

我有一个关于我正在为 .NET Framework 中的 RESTful/服务/API 编写 C# 代码的技术查询。我试图基于将返回布尔响应的谓词进行查询,而我知道的一种方法是使用 .Select 或 .Any。但是,它们都不能与我的解决方案完美配合,因为我收到一条错误消息,提示“不支持方法 'Select'。\r\nActivityId:..”或“不支持方法 'Any'。\r\nActivityId :.." 相应地。这是我在谓词上使用方法的代码块:

var users = await this.GetEntitiesAsync(x =>
                          x.Type == typeof(models.User).FullName &&
                          x.TenantId == tenantId &&
                          x.Outlets.Select(y => y.Id.ToString()).Contains(storeId) &&
                          (x.UserName == userName && (x.Password == password || x.Pin == pin)));

这里是 GetEntitiesAsync() 函数的细分:

public virtual async Task<IEnumerable<TEntity>> GetEntitiesAsync(Expression<Func<TEntity, bool>> predicate)
    {
        if (!CollectionIdExists())
            throw new ArgumentNullException(nameof(CollectionId));


        using (var client = new DocumentClient(new Uri(EndPoint), AuthKey))
        {
            IDocumentQuery<TEntity> query = client.CreateDocumentQuery<TEntity>(
            UriFactory.CreateDocumentCollectionUri(DatabaseId, CollectionId))
            .Where(predicate)
            .AsDocumentQuery();

            List<TEntity> results = new List<TEntity>();
            while (query.HasMoreResults)
            {
                results.AddRange(await query.ExecuteNextAsync<TEntity>());
            }
            return results;
        }

    }

此外,我更喜欢修改谓词,因为该函数用于其他服务,如果我对该函数进行更改,可能会影响程序中的其他功能。但是,只要有相关的解决方案,我一定会试一试。此外,我对我目前正在开发的环境中的开发有点陌生,因此为给您带来的麻烦表示歉意。我确实需要尽快解决这个问题,并且在发布此讨论时,我一直在为解决方案做一些深入的研究。提前感谢您的关心。祝你玩得开心! :)

【问题讨论】:

    标签: c# linq azure select boolean


    【解决方案1】:

    谓词中的这一行

    x.Outlets.Select(y => y.Id.ToString()).Contains(storeId)
    

    无效。您不能在谓词中返回投影。相反,您应该将其更新为使用 .Where(),并专门查找 Id 与您的 storeId 匹配的 Outlets。

    x.Outlets.Where(y => y.Id.ToString() == storeId)
    

    【讨论】:

    • 嗨,戴夫,感谢您的回复。我之前尝试过您建议的代码,但是 GetEntitiesAsync() 函数期望返回布尔值,所以如果我将它应用于我的谓词,它将不起作用,因为它会返回一个对象而不是布尔值。此外,我确实尝试了 .ToBoolean(),但显然与 .Select() 相同,这在 Azure Linq 中不受支持。无论如何,这不是我的工作,我只是想帮助一位同事,他说那行代码不再使用了。不过,谢谢你的好意。 :) 问候,乔纳斯
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-02
    • 1970-01-01
    • 2018-12-17
    • 1970-01-01
    • 1970-01-01
    • 2013-04-16
    • 1970-01-01
    相关资源
    最近更新 更多