簡體   English   中英

Lambda表達式,以檢查值是否為null或等於

[英]Lambda expression to check if value is null or equals

我正在開發一個Asp.Net MVC應用程序,並且對Linq和CodeFirst還是陌生的。 在我的控制器中,這是我編寫的動作:

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);
}

但是我知道這不是在Linq和Codefirst中最好的方法。 那么,您能為這個問題提供更好的解決方案嗎?

你可以這樣做:

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

您要避免的是代碼重復。
創建原始的IQueriable,然后在必要時添加where子句

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);
}

您只需分配所有元素到列表中,然后過濾每個if條件中的每個元素

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());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM