query managewindows c# linq azure azure-cosmosdb

c# - managewindows - Error de DocumentDb de Azure "La consulta debe evaluar a IEnumerable"



managewindows azure (2)

Tengo problemas al intentar consultar mi cuenta de almacenamiento de Azure DocumentDb al intentar recuperar un solo registro. Este es mi código 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); } }

Es este método FindById que causa el siguiente problema:

Se produjo una excepción de tipo ''Microsoft.Azure.Documents.Linq.DocumentQueryException'' en Microsoft.Azure.Documents.Client.dll pero no se manejó en el código de usuario

Información adicional: la expresión de consulta no es válida, el tipo de retorno de expresión
Foo.Models.DocumentDbEntities.UserDetail no es compatible. La consulta debe evaluar a IEnumerable.

No entiendo qué significa este error o cómo lo soluciono. No deseo devolver un IEnumerable o cualquier clase descendiente ya que este método devolverá 0 o 1 registros. Funciona si SingleOrDefault cláusula SingleOrDefault y cambio el tipo de retorno a un IQueryable , sin embargo, esto no es lo que quiero.


No puedo decir por qué la sintaxis de Ryan dejó de funcionar para usted, pero debería poder solucionarlo sin el impacto de rendimiento adicional utilizando una sobrecarga CreateDocumentQuery <> () con una cadena de consulta explícitamente definida en lugar de usar .Where () :

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

Es posible que deba jugar un poco con la consulta, pero algo de esa forma debería funcionar.


SingleOrDefault() no es compatible, sin embargo, en el proveedor LINQ.

Cambie esto a .Where(u => u.Id.ToString() == id).AsEnumberable().FirstOrDefault();