Подтвердить что ты не робот

Ошибка Azure DocumentDb "Запрос должен оцениваться в IEnumerable"

У меня возникают проблемы с попыткой запросить мою учетную запись хранилища 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.Linq.DocumentQueryException" произошло в Microsoft.Azure.Documents.Client.dll, но не было обработано в коде пользователя

Дополнительная информация: выражение запроса недопустимо, выражение return type
Foo.Models.DocumentDbEntities.UserDetail не поддерживается. Запрос должен оцениваться в IEnumerable.

Я не понимаю, что означает эта ошибка, или как я ее исправляю. Я не хочу возвращать IEnumerable или любой класс потомков, так как этот метод возвращает либо записи 0, либо 1. Он работает, если я удаляю предложение SingleOrDefault и меняю тип возврата на IQueryable, однако это не то, что я хочу.

4b9b3361

Ответ 1

SingleOrDefault() не поддерживается, но у поставщика LINQ.

Измените это на .Where(u => u.Id.ToString() == id).AsEnumberable().FirstOrDefault();

Ответ 2

Я не могу сказать, почему синтаксис Ryan перестает работать для вас, но вы можете обойти его без дополнительной производительности с помощью перегрузки CreateDocumentQuery < > () с явно определенной строкой запроса вместо использования. Где():

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

Возможно, вам придется немного поиграть с запросом, но что-то в этой форме должно работать.