EF базовый набор с дополнительным расширением - PullRequest
0 голосов
/ 16 февраля 2019

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

public IQueryable<Doc> grids (string filter)
{
     int all = int.MaxValue;
     if (string.IsNullOrEmpty(filter))
         all = 5;
     return rampa.Doc.Where(x => x.Napomena.Contains(filter)).Take(all);
}

Есть ли лучший способ избежать условного расширения.Я не хочу обременять SQL-сервер ненужными подсказками.

Ответы [ 3 ]

0 голосов
/ 16 февраля 2019

Одним из основных требований использования Take() является необходимость использования OrderBy с ним.Тогда, чтобы избежать top(int.max), напишите ваш запрос следующим образом:

public IQueryable<Doc> grids (string filter)
{ 
     IQueryable<Doc> query =  rampa.Doc;

     if (string.IsNullOrEmpty(filter))
     {
         query.Where(x => x.Napomena.Contains(filter)).Orderby(x => x.OrderByColumn).Take(5);
     }

     return query;
}
0 голосов
/ 16 февраля 2019

С точки зрения пользователя поведение должно быть понятным.Он не поймет, почему он получает только 5 записей без фильтра, но 25, когда входит в фильтр.Хороший способ решить эту проблему - предложить ему варианты в поле со списком или с помощью переключателей и т. Д., Где он может выбрать максимальное количество возвращаемых записей.(Например, 10, 30 или 100).У вас всегда будет .Where(filter).Take(maxRecords), где maxRecords было выбрано пользователем.

В любом случае следует выполнить Take(max), независимо от того, входит пользователь в фильтр или нет, чтобы никогда не попасть в ситуацию.где фильтр возвращает больше записей, чем без фильтра.Это может произойти, если, например, пользователь введет «e» в качестве фильтра, то, вероятно, будет возвращен высокий процент записей.

Также сделайте результат воспроизводимым и понятным.Поэтому я также предлагаю применить заказ до .Take(max).

с фильтром

result = source
    .Where(filter)
    .OrderBy(order)
    .Take(max);

или без фильтра

result = source
    .OrderBy(order)
    .Take(max);
0 голосов
/ 16 февраля 2019

Поскольку вы возвращаете IQueryable, вы можете построить свой запрос на условиях:

public IQueryable<Doc> grids (string filter)
{
    IQueryable<Doc> items = rampa.Doc;
    if (string.IsNullOrEmpty(filter))
        items = items.Take(5);
    else 
        items = items.Where(x => x.Napomena.Contains(filter));
    return items;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...