MVC LINQ SELECT ALL, когда параметр пуст - PullRequest
1 голос
/ 25 октября 2019

У меня есть контроллер типа:

public ActionResult Index(string xyear, string xmonth)
{
      var query = db.Masters.Include(m => m.MasterOrigin)
                        .Where(c => (c.Year == xyear) && (c.Month == xmonth));

      return View(query.ToList());
}

Я хочу загрузить список при нажатии кнопки. Если xyear равно нулю, а xmonth установлено на 1 ... Тогда список загрузит все данные с помощью Month = 1. Или, если xyear установлено на 2019, а xmonth установлено на ноль ... Тогда список загрузит все данные с Year = 2019. ff.

У кого-нибудь есть идея для этого случая?
Действительно оценили

Ответы [ 3 ]

1 голос
/ 25 октября 2019

попробуйте

public ActionResult Index(string xyear, string xmonth)
{
      var query = db.Masters.Include(m => m.MasterOrigin)
                        .Where(c => (c.Year == xyear || xyear == null) && (c.Month == xmonth || xmonth == null));

      return View(query.ToList());
}
0 голосов
/ 25 октября 2019

почему бы не связать where в зависимости от нуля?

var query = db.Masters.Include(m => m.MasterOrigin).AsQueryable();

if (xyear != null && xMonth == null)
{
    query = query.Where(x => x.Year == xyear);
}
if (xyear == null && xMonth != null)
{
   query = query.Where(x => x.Month == xMonth);
}
var result = query.ToList();

return View(result);

или если вы уверены, что когда xYear != null, xMonth == null, то

if (xyear != null)
{
    query = query.Where(x => x.Year == xyear);
}
if (xMonth != null)
{
   query = query.Where(x => x.Month == xMonth);
}

var result = query.ToList();

return View(result);
0 голосов
/ 25 октября 2019

Попробуйте что-то вроде

var predicateBuilder = PredicateBuilder.New<Master>(true);
predicateBuilder = xyear != null : predicateBuilder.And(c => c.Year == xyear): 
                                   predicateBuilder;
predicateBuilder = xmonth != null : predicateBuilder.And(c => c.Month == xmonth) : 
                                    predicateBuilder;
var query = db.Masters.Include(m => m.MasterOrigin)
                        .Where(peridicateBuilder);
return View(query.ToList());

Предполагается, что вы используете пакет NuGet PredicateBuilder.

Это добавляет в предложениях месяца или года where, только если параметр не null.

Альтернатива без построителя предикатов:

var query = db.Masters.Include(m => m.MasterOrigin);
 if (xyear =! null)
 {
    query = query.Where(c => (c.Year == xyear));
}
if (xmonth = !null)
{
    query = query.Where(c => (c.Year == xmonth));
}

return View(query.ToList());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...