C # OData: получить результат OData очень медленно - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть это действие:

[EnableQuery]
 public IHttpActionResult Get()
 {
     var ordWeb = orderCtx.ORDER.AsQueryable();
     var ordWebDTO =ordWeb.ProjectTo<ORDER>(mapper.ConfigurationProvider);
     return Ok(ordWebDTO.toList);
 }

Это действие внутри контроллера.

orderWebDTO является результатом сопоставления некоторых полей из разных таблиц базы данных.

В этом случае Odata запрос, поступающий с Url, должен быть обработан ПОСЛЕ «обратного» вызова.

, когда я использую Odata Запрос в URL (например, localhost / Controller?% 24top= 30) EntityFramework загружает все данные из базы данных БЕЗ фильтрации их (в примере: последние 30 записей).

Это очень дорого: у меня более 35 тыс. Записей, и они загружаются все и ПОСЛЕ получения последних 30...

Как решить эту проблему?

ОБНОВЛЕНИЕ 09.13.18

У меня есть такой вид сопоставления с одним значением, вычисленным во время работы над отображением.

var c = new MapperConfiguration(
              cfg => cfg.CreateMap<ORDER, ORDER_WEB>()
                .ForMember(....)
                .ReverseMap()
              );
            mapper = c.CreateMapper();

В модели ORDER_WEB у меня есть:

public class ORDER_WEB
{
        ...
        ...

        public string ValueFromEntityFrameworkModel  {get; set;}

        public string Set_ORDER
        {
            get
            {
                ORDER_TYPE tipo = new ORDER_TYPE();
                return tipo.GetData(ValueFromEntityFrameworkModel);
            }
            set { }
}

без toList() Не может работать ... По этой причине OData работает на ВСЕХ записях и ПОСЛЕ назначенияотображение значений, включая Set_ORDER.

Дело в том, что: возможно ли сделать очередь ODatary (с атрибутами / параметрами) с несколькими записями и ПОСЛЕ присвоения значений?

Я надеюсь, что будет ясно ...

1 Ответ

0 голосов
/ 12 сентября 2018

В вашем образце кода есть ошибки, но если это точно отражает то, что вы делаете в фактическом образце кода, тогда

ordWebDTO.ToList()

Отправится в базу данных и извлечет все записи 35 КБ, а затем применяет фильтры OData, которые вы хотели применить. Сравните это с:

[EnableQuery]
public IQueryable<ORDER> Get()
{
    var ordWeb = orderCtx.ORDER.AsQueryable();
    var ordWebDTOs =ordWeb.ProjectTo<ORDER>(mapper.ConfigurationProvider);
    return ordWebDTOs;
}

Это вернет IQueryable, к которому будут применены фильтры OData, чтобы при материализации списка это был эффективный запрос к базе данных.

...