LINQ запрос к БД

216
21 декабря 2017, 23:02

Делаю запрос к БД, сначала беру данные из таблицы Technologies, далее идет поиск, сортировка + разбиваю на страницы. Получается очень много похожего кода.

switch (sort) {
  case "Low":
    items.Tvsets = db.Technologies.Where(x => x.Name.Contains(tech))
      .Include(p => p.Tvsets.Select(x => x.Company))
      .FirstOrDefault() ? .Tvsets
      .Where(x => x.Name.Contains(search) ||
        x.Company.Name.Contains(search) ||
        x.Technology.Name.Contains(search))
      .OrderBy(x => x.Price)
      .Skip((pageInfo.PageNumber - 1) * pageInfo.PageSize)
      .Take(GetAll(pageInfo.TotalItems, pageInfo.PageSize, pageInfo.PageNumber))
      .ToList();
    return View(items);
  default:
    ViewBag.Sort = "High";
    items.Tvsets = db.Technologies.Where(x => x.Name.Contains(tech))
      .Include(p => p.Tvsets.Select(x => x.Company))
      .FirstOrDefault() ? .Tvsets
      .Where(x => x.Name.Contains(search) ||
        x.Company.Name.Contains(search) ||
        x.Technology.Name.Contains(search))
      .OrderByDescending(x => x.Price)
      .Skip((pageInfo.PageNumber - 1) * pageInfo.PageSize)
      .Take(GetAll(pageInfo.TotalItems, pageInfo.PageSize, pageInfo.PageNumber))
      .ToList();
    return View(items);
}

Как можно уменьшить код? Может быть есть какие-либо паттерны или другие способы?

Answer 1

попробуйте так:

var tvSets = db.Technologies
               .Where(x => x.Name.Contains(tech))
               .Include(p => p.Tvsets.Select(x => x.Company))
               .FirstOrDefault() ? .Tvsets
               .Where(x => x.Name.Contains(search) ||
                           x.Company.Name.Contains(search) ||
                           x.Technology.Name.Contains(search)).AsQueryable();
if (sort == "Low")
{
    tvSets = tvSets.OrderBy(x => x.Price);
}
else
{
    ViewBag.Sort = "High";
    tvSets = tvSets.OrderByDescending(x => x.Price);
}
items.Tvsets = tvSets.Skip((pageInfo.PageNumber - 1) * pageInfo.PageSize)
                     .Take(GetAll(pageInfo.TotalItems, pageInfo.PageSize, pageInfo.PageNumber))
                     .ToList();
return View(items);

Т.е. выделяем общее в обоих запросах, а различие в зависимости от параметра. В данном случае у вас всего одно различие, в сортировке. Вот ее и выделили. Запрос не выполнится до тех пор, пока не будет вызван .ToList(). До этих пор его можно собирать кусочками, не опасаясь, что на сервер уйдет кусок запроса.

READ ALSO
Вызвать Console.Write

Вызвать Console.Write

ConsoleWrite указан в новом потоке,но вызвать нужно его в основном - как мне основной поток получить?

253
Проект перестал компилироваться на Ios в Xamarin Live Player

Проект перестал компилироваться на Ios в Xamarin Live Player

Начал только разбираться в Visual Studio 2017, в частности работе с Xamarin FormsУстановил на телефон Xamarin Live Player, но не могу развернуть даже пустой проект...

178
Нужна помощь в upload file C# application form

Нужна помощь в upload file C# application form

Всем добрый деньПишу приложение для ПК

193
Запуск внешнего wcf сервиса на ASP.NET CORE

Запуск внешнего wcf сервиса на ASP.NET CORE

Доброго времени сутокИмеется некий внешний WCF сервис располагающийся по адресу:

411