Простой запрос с использованием withParameters и расширение, а не расширение

Мне нужно было реализовать некоторую бизнес-логику на стороне сервера в процессе выборки сущностей, чтобы гарантировать, что у пользователя есть разрешение на извлекаемый элемент.

Для этого мой код запроса бриза на стороне клиента изменился примерно так:

var query = breeze.EntityQuery
    .from(theUrl)
    .expand("RelatedEntity")
    .where(breeze.Predicate.create("id", "==", id));

to:

var query = breeze.EntityQuery
    .from(theUrl)
    .withParameters({ id: id })
    .expand("RelatedEntity");

На стороне сервера действие моего контроллера изменилось с:

[HttpGet]
[BreezeQueryable]
public IQueryable<MyEntity> MyEntities()
{
    return _uow.MyEntityRepo.All();
}

на что-то вроде:

[HttpGet]
[BreezeQueryable]
public IHttpActionResult FindById(int id)
{
    var userId = HttpContext.Current.User.Identity.GetUserId();
    var hasPermission = CheckPermission(id, userId); // some implementation ...

    if (hasPermission) {
        var myEntity = _uow.MyEntityRepo.GetById(id);
        return Ok(myEntity)
    } else {
        return NotFound();
    }
}

Я вижу, что запрос попадает в сеть с фильтром:

http://localhost:42789/breeze/MyEntity/FindById?$expand=RelatedEntity&id=1002

Однако RelatedEntity не определено. При использовании EntityQuery, но не withParameters, связанный объект прекрасно расширяется и доступен в наборе результатов.

Спасибо


person George Durzi    schedule 10.06.2014    source источник


Ответы (1)


Вызов withParameters должен ссылаться на конечную точку IQueryable, и вам также нужно, чтобы эта конечная точка была названа на клиенте. Кроме того, если вы хотите вызвать expand, возвращаемый запрос должен поддерживать операцию EF 'Include'. Так, например, если у вас есть метод на стороне сервера, подобный этому

[HttpGet]
public IQueryable<Customer> CustomersStartingWith(string companyName) {
  return ContextProvider.Context.Customers.Where(c => c.CompanyName.StartsWith(companyName));
}

Затем вы можете запросить его с помощью запроса на стороне клиента, например:

var q = EntityQuery.from("CustomersStartingWith")
        .withParameters({ companyName: "C" })
        .expand("orders");

Обратите внимание на «CustomersStartingWith» в качестве аргумента предложения «from».

person Jay Traband    schedule 10.06.2014
comment
Спасибо, Джей. Это работает для меня, но единственный недостаток, который я вижу, заключается в том, что я не могу использовать HttpActionResult для правильной передачи 404 или 401 обратно клиенту. Я могу обойти это, хотя. - person George Durzi; 11.06.2014
comment
На самом деле вы можете вернуть 401 или 404, создав исключение HttpResponseException внутри вашего метода сервера: [HttpGet] public IQueryable‹Customer› CustomersWithHttpError() { var responseMsg = new HttpResponseMessage(HttpStatusCode.NotFound); responseMsg.Content = new StringContent (собственное сообщение об ошибке); responseMsg.ReasonPhrase = пользовательская причина; бросить новое исключение HttpResponseException (responseMsg); } - person Jay Traband; 11.06.2014