Azure DocumentDb错误“;查询必须计算为IEnumerable”;

本文关键字:计算 IEnumerable 查询 DocumentDb 错误 Azure | 更新日期: 2023-09-27 18:28:58

在尝试检索单个记录时,我在尝试查询Azure DocumentDb存储帐户时遇到问题。这是我的WebAPI代码:

// Controller...
public AccountController : ApiController {
    // other actions...
    [HttpGet]
    [Route("Profile")]
    public HttpResponseMessage Profile()
    {
        var userId = User.Identity.GetUserId();
        var rep = new DocumentRepository<UserDetail>();
        var profile = rep.FindById(userId);
        if (profile == null)
            return Request.CreateErrorResponse(HttpStatusCode.NotFound, "Profile not found");
        return Request.CreateResponse(HttpStatusCode.OK, profile);
    }
}
// Repository
public class DocumentRepository<TEntity> : IDocumentRepository<TEntity> where TEntity : IIdentifiableEntity
{
    private static DocumentClient _client;
    private static string _databaseName;
    private static string _documentsLink;
    private static string _selfLink;
    public DocumentRepository()
    {
        _client = new DocumentClient(new Uri(ConfigurationManager.AppSettings["DocumentDbEndpointUrl"]), ConfigurationManager.AppSettings["DocumentDbAuthKey"]);
        _databaseName = ConfigurationManager.AppSettings["DocumentDbDatabaseName"];
        var _database = ReadOrCreateDatabase();
        var collection = InitialiseCollection(_database.SelfLink, EntityName);
        _documentsLink = collection.DocumentsLink;
        _selfLink = collection.SelfLink;
    }
    // other methods...
    public TEntity FindById(string id)
    {
        return _client.CreateDocumentQuery<TEntity>(_documentsLink).SingleOrDefault(u => u.Id.ToString() == id);
    }
}

正是这种FindById方法导致了以下问题:

Microsoft.Azure.Documents.Client.dll中出现类型为"Microsoft.Azure.Cocuments.Linq.DocumentQueryException"的异常,但未在用户代码中处理

附加信息:查询表达式无效,表达式返回类型
Foo.Models.DocumentDbEntities.UserDetail不受支持。查询的计算结果必须为IEnumerable。

我不明白这个错误是什么意思,也不知道如何修复它。我不希望返回IEnumerable或任何子类,因为这个方法将返回01记录。如果我删除SingleOrDefault子句,并将返回类型更改为IQueryable,它就会起作用,但这不是我想要的。

Azure DocumentDb错误“;查询必须计算为IEnumerable”;

SingleOrDefault()在LINQ提供程序中不受支持。

将其更改为.Where(u => u.Id.ToString() == id).AsEnumberable().FirstOrDefault();

我不能说为什么Ryan的语法不再适用于您,但您应该能够通过使用CreateDocumentQuery<>来解决它,而不会带来额外的性能影响()使用显式定义的查询字符串重载,而不是使用。Where():

string query = string.Format("SELECT * FROM docs WHERE docs.id = '"{0}'"", id);
return _client.CreateDocumentQuery<TEntity>(DocumentsLink, query).AsEnumerable().FirstOrDefault();

您可能需要稍微处理一下查询,但这种形式的东西应该可以使用。