我试图查询我的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中发生,但未在用户代码中处理
附加信息:查询表达式无效,表达式返回类型Foo.Models.DocumentDbEntities.UserDetail不受支持。查询必须评估为IEnumerable。
我不理解这个错误是什么意思,也不知道该如何修复它。我不想返回IEnumerable
或其任何子类,因为此方法将返回0
或1
条记录。如果我删除SingleOrDefault
子句并将返回类型更改为IQueryable
,则可以正常工作,但这不是我想要的。
Where
前面使用AsEnumerable
,否则会出错。除此之外没有任何更改。这看起来很奇怪。当前的工作代码是:return Client.CreateDocumentQuery<TEntity>(DocumentsLink).AsEnumerable().Where(u => u.Id.ToString() == id).FirstOrDefault();
这不理想,因为会对请求方造成检索所有集合并过滤的性能影响。 - Rory McCrossanAsEnumberable
中有一个拼写错误。它应该是AsEnumerable
。作为一个懒惰的开发者,我在复制和粘贴时注意到了这一点。 - Siva Kandaraj