Свойство вычисления ODATA ядра Asp.Net после фильтра - PullRequest
0 голосов
/ 10 октября 2019

Есть ли способ создать вычисляемое свойство по HTTP-запросу ODATA после обработки фильтра ODATA?

У меня есть следующая модель

class Person
{
  public string Name { get; set; }
  public string Email { get; set; }
  public string ImageLink { get; set; } //This is computed

}

И следующие IEdmModel

private static IEdmModel GetEdmModel(IApplicationBuilder app)
{
    var builder = new ODataConventionModelBuilder(app.ApplicationServices).EnableLowerCamelCase();

    var person = builder.EntitySet<Person>("People").EntityType;
    person.Property(x => x.Name);
    person.Property(x => x.Email);
    person.Property(x => x.ImageLink).IsOptional();

    return builder.GetEdmModel();
}

Ссылка на изображение генерируется динамически и является довольно дорогостоящим процессом, так как ссылка подписана. Есть ли способ добавить только добавить это свойство, если оно явно включено $select, и производить вычисления только после применения фильтра?

Установка свойства Select(SelectExpandType.Allowed), по-видимому, не исключает его измодель.

Мне удалось вручную исключить свойство, проверив строку запроса в контроллере. Но свойство все еще включено в модель, значение равно нулю, и, очевидно, оно запускается до применения какого-либо фильтра.

var people = await _personService.FetchAllPeopleAsync(cancellationToken);
if (Request.Query.TryGetValue("$select", out var values) && 
    values.Any(v => v.Contains(nameof(Person.ImageLink))))
{
    return _photoService.AttachImageLinks(Url, people);
}

return people;
...