ReZa
ReZa

Reputation: 1283

Lambda expression to check if value is null or equals

I am developing an Asp.Net MVC Application and i am new to Linq and CodeFirst. In my controller this is the action that i have written:

public ActionResult Filter(int? PaperType , int? PaperGram , int? Brand)
{
    var FilteredResult ;
    if (PaperType.HasValue && PaperGram.HasValue && Brand.HasValue) {
        FilteredResult = db.Stocks.where(m => m.PaperType == PaperType && m.PaperGram == PaperGram && m.Brand == Brand);
    }
    else if (PaperType.HasValue && PaperGram.HasValue) {
        FilteredResult = db.Stocks.where(m => m.PaperType == PaperType && m.PaperGram == PaperGram);
    }
    else if (PaperType.HasValue && Brand.HasValue) {
        FilteredResult = db.Stocks.where(m => m.PaperType == PaperType && m.Brand == Brand);
    }
    // and ifs continue to last 
    /*
    .
    .
    .
    .
    */
    else {
        FilteredResult = db.Stocks;
    }

    return View(FilteredResult);
}

But i know that this is not the best way to do in Linq and Codefirst. So, can you give a better solution to this problem?

Upvotes: 1

Views: 3387

Answers (3)

Pawel Maga
Pawel Maga

Reputation: 5787

You can just assign all elements to list and then filter every element in each if condition

IEnumerable<Stock> filteredResult = db.Stocks.AsQueryable();

if (PaperType.HasValue) 
{
    filteredResult = filteredResult.Where(m => m.PaperType == PaperType);
}
if (PaperGram.HasValue) 
{
    filteredResult = filteredResult.Where(m => m.PaperGram== PaperGram);
}
if (Brand.HasValue) 
{
    filteredResult= filteredResult.Where(m => m.Brand== Brand);
}

return View(FilteredResult.ToList());

Upvotes: 1

George Vovos
George Vovos

Reputation: 7618

What you want to avoid is code duplication.
Create your original IQueriable and then add your where clauses when necessary

public ActionResult Filter(int? PaperType, int? PaperGram, int? Brand)
{
    var FilteredResult FilteredResult = db.Stocks.AsQueryable();
    if(PaperType.HasValue)
    {
        FilteredResult = FilteredResult.where(m => m.PaperType == PaperType);
        if(PaperGram.HasValue)
             FilteredResult = FilteredResult.where(m =>  m.PaperGram == PaperGram );

        if ( Brand.HasValue)
              FilteredResult = FilteredResult.where(m => m.Brand == Brand);
    }
    return View(FilteredResult);
}

Upvotes: 1

dario
dario

Reputation: 5269

You can do this:

FilteredResult = db.Stocks.where(m => (m.PaperType == PaperType || !PaperType.HasValue)
                                   && (m.PaperGram == PaperGram || !PaperGram.HasValue) 
                                   && (m.Brand     == Brand     || !Brand.HasValue));

Upvotes: 2

Related Questions