2015-06-20 131 views
0

我正在開發一個Asp.Net MVC應用程序,我是Linq和CodeFirst的新手。在我的控制器中,這是我寫的操作:Lambda表達式來檢查值是否爲空或等於

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中最好的方法。那麼,你能否更好地解決這個問題?

回答

2

你可以這樣做:

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

要避免什麼是代碼重複。
創建原始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); 
} 
1

您可以只分配所有元素列表,然後過濾掉所有元素中的每個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()); 
+0

從這個問題我明白所有其他標準必須添加只有PaperType.HasValue所以你必須像我一樣移動所有ifs(除非我錯了......) –

+0

在我看來,他需要這些patameters的不同組合 –

相關問題