Home > Mobile >  Filtering data from parameters c#
Filtering data from parameters c#

Time:11-05

I'm facing a issue when trying to search my page when trying to filter from 5 parameters.

If the parameters is null then I would want to ignore that search and only return results if there is a value in the parameters.

At the moment i used separate parameters but i need something that caters for all 5 and if it has 2 out of 4 values then it should return based on the filter.:

                if (name != null)
                {
                    report = report.Where(asd => asd.name == name).OrderBy(x => x.Id).ToList();
                }
                else if (Id != null)
                {
                    report = report.Where(x => x.Id == Id).OrderBy(x => x.Id).ToList();
                }

So this works with only 1 in mind, how would i join all 4 together so it works together.

This is my full code:

        [HttpGet]
        public ActionResult Get(string Id = null, string name = null, string status = null, string startDate = null, string endDate = null)
        {
            List<ReportModel> report = new List<ReportModel>();
                report = (from data in _context.ReportData
                                   //where data.Id== Id
                                   //&& data.name== name
                                   //&& data.Status == status
                                   //&& data.Date >= Convert.ToDateTime(startDate) && data.Date < Convert.ToDateTime(endDate)
                           select new ReportModel
                           {
                                              Id = data.Id,
                                              Name = data.Plant,
                                              Status = data.Status,
                                              Date = data.Date
                                          }).ToList();

                if (name != null)
                {
                    report = report.Where(asd => asd.name == name).OrderBy(x => x.Id).ToList();
                }
                else if (Id != null)
                {
                    report = report.Where(x => x.Id == Id).OrderBy(x => x.Id).ToList();
                }
                else if (status != null)
                {
                    report = report.Where(x => x.Status == status).OrderBy(x => x.Id).ToList();
                }

                return Ok(report);
            }

Kindly help.

CodePudding user response:

If you care about performance, do not call ToList() early, because it will load whole table into the memory. IQueryable can be combined to produce desired result.

[HttpGet]
public ActionResult Get(string Id = null, string name = null, string status = null, string startDate = null, string endDate = null)
{
    var query = _context.ReportData.AsQueryable();

    if (name != null)
    {
        query = query.Where(asd => asd.name == name);
    }

    if (Id != null)
    {
        query = query.Where(x => x.Id == Id);
    }

    if (status != null)
    {
        query = query.Where(x => x.Status == status);
    }

    query = query.OrderBy(x => x.Id);

    var report = query
        .Select(data => new ReportModel
        {
            Id = data.Id,
            Name = data.Plant,
            Status = data.Status,
            Date = data.Date
        })
        .ToList();

    return Ok(report);
}

CodePudding user response:

Intead of using if condition, you can add directly the condition in the Where clause

if (name != null)
{
    query = query.Where(asd => asd.name == name);
}
// replace by
query = query.Where(asd => asd.name == name || name == null);

when name will be null, the Where condition will always true.

  • Related