2016-01-21 37 views
1

我有這樣的控制器:獲取從數據庫中的所有用戶名的列表中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」(或枚舉結果並轉換爲模型)來評估查詢並將結果集合返回到視圖。 –

回答

4

您可以添加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); 
0

如果你計劃在將來創造更多的搜索領域,你將要設置您的查詢,以適應不重構。這裏是一個常用的方法:

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

設置你的方法一樣,這是很容易跟隨,當添加新的搜索標準擴展,並將得到的查詢只包括由用戶輸入的參數。

相關問題