获取从数据库中的所有用户名的列表中MVC 4

问题描述:

我有这样的控制器:获取从数据库中的所有用户名的列表中MVC 4

public ActionResult NameSearch(SearchModel userSearch) 
    { 

      if (ModelState.IsValid) 
      { 

       var db = new reviewlogsEntities(); 



       return View(db.logrecords.Where(m => m.username == userSearch.userName).ToList()); 

      } 


     return RedirectToAction("index", "home"); 




    } 

我的问题是,目前正在寻找日志的用户正在寻找一个用户名,一旦他们有一个用户名,他们可以输出一个列表。我现在面临的问题是如果他们没有输入用户名,我的要求是什么。应该发生什么事情,所有的用户和他们的日志应该出现。我可以只让if语句说,如果空只是做

return View(db.logrecords.ToList()); 

我觉得有另一种方式我可以做到这一点,而不必这样做。因为我的思维过程是,如果搜索需要更复杂的话。他们可能不会输入用户名,但他们可以输入他们正在寻找的日期,反之亦然。如果没有它,那么我就无法真正做到超级混乱。任何帮助真的会很感激!

+0

如果您使用的是实体框架,默认情况下'IQueryable '被懒惰地评估,使它们可组合。因此,您可以使用多个条件语句逐步向查询引入过滤器。完成后,只需通过调用“ToList”(或枚举结果并转换为模型)来评估查询并将结果集合返回到视图。 –

您可以添加if条件并根据需要对logrecords dbset执行更多筛选。

假设db是你的DbContext和db.logrecords的目的是类型的DbSet<LogRecord>

IQueryable<LogRecord> recordsDbSet = db.logrecords; 
if(!String.IsNullOrEmpty(userSearch.UserName)) 
{ 
    recordsDbSet = recordsDbSet.Where(m => m.username == userSearch.userName) 
} 
var resultList = recordsDbSet.ToList(); 
return View(resultList); 

如果你计划在将来创造更多的搜索领域,你将要设置您的查询,以适应不重构。这里是一个常用的方法:

var searchResults = db.logresults.AsQueryable(); 

//User Name 
if (userSearch.username != string.empty) 
    searchResults = searchResults.Where(l => l.username == userSearch.username); 

//From Date 
if (userSearch.FromDate != DateTime.MinValue) 
    searchResults = searchResults.Where(l => l.CreatedDate >= userSearch.FromDate); 

//To Date 
if (userSearch.ToDate != DateTime.MinValue) 
    searchResults = searchResults.Where(l => l.CreatedDate <= userSearch.ToDate); 

//Category (because logs always end up categorized) 
if (userSearch.Category != LogCategories.All) //assuming enum here 
    searchResults = searchResults.Where(l => l.Category == userSearch.Category); 

设置你的方法一样,这是很容易跟随,当添加新的搜索标准扩展,并将得到的查询只包括由用户输入的参数。