2015-06-20 986 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的不同组合 –