2013-12-12 75 views
3

所以我有這樣的代碼:asp.net 4.5 MVC SQL選擇像

public ActionResult SearchIndex(string id) 
    { 
     string searchString = id; 


     var members = from m in db.Members 
         select m; 

     if (!String.IsNullOrEmpty(searchString)) 
     { 
      members = members.Where(m => m.town.Equals(searchString)); 
     } 

     return View(members); 
    } 

這將選擇在我的數據庫中的所有城鎮的名字,我知道了在下拉菜單中顯示。

我該如何改變它,以便在顯示城鎮名稱時只顯示一次城鎮名稱。

例如,如果我在數據庫中有3個londons,它會在下拉菜單中顯示全部3個londons。我希望它只會顯示1個倫敦

回答

3

您要使用的Distinct method on IEnumerable

var towns = members.Where(m => m.town.Equals(searchString)) 
        .Select(m => m.town).Distinct(); 

這將Select僅該鎮值,然後拿到Distinct值,因此倫敦將只能拿出一次。

+0

不起作用。返回錯誤:存在顯式轉換 – user1300788

+1

@ user1300788對不起,這是因爲您試圖用不同類型的東西覆蓋成員變量。創建一個名爲towns的新變量(無論如何,這個變量更有意義)並設置它。 – paqogomez

+0

我仍然得到相同的錯誤:/你可以編輯你的答案,以顯示你如何做到這一點? – user1300788

2

我不確定接受的答案是否可以解決您的原始問題,即從控制器返回一個Member的枚舉值,並在鎮上使用可選過濾器,將列表限制爲最多一個成員每個鎮:

var members = db.Members; // Or .AsQueryable(); 

if (!String.IsNullOrEmpty(searchString)) 
{ 
    // Apply the conditional filter, returning Members 
    members = members.Where(m => m.town == searchString); 
} 

// First of each member only (randomly) 
return View(members 
      .GroupBy(m => m.town) 
      .Select(grp => grp.First())); 

看來不過是你的真實需求是

  • 查看與過濾IEnumerable<Member>爲@Model
  • 作爲第二個要求,填充不同城鎮的下拉列表

在這種情況下,您還可以投影IEnumerable<string>,例如,分成ViewBag或更好,創建一個自定義ViewModel類,其中包含已過濾的成員列表和不同城鎮的下拉列表。

ViewBag.DistinctTowns = db.Members.Select(m => m.town).Distinct(); 
+0

如何添加一個orderBy按字母順序排列到這個位(m => m.town).Distinct();'?代碼工作很好順便說一句,謝謝 – user1300788

+1

@ user1300788 .Distinct()。OrderBy(t => t); (和+1 StuartLC) – paqogomez