2016-04-15 1 views
1

Datenbanktabelle:Machen Sie eine Dropdownlist Distinct

|ID|  |Athlete|  |Sport| 
1  Jacoby Ellsbury  Baseball 
2  Dustin Pedroia  Baseball 
3  Kobe Bryant  Basketball 
4  Lebron James  Basketball 
5  Patrick Kane   Hockey 
6  Sidney Crosby  Hockey 

ich auf meine Aktion erstellen ein Dropdownlist nur der Sport Eigenschaft erstellen möchten

Was habe ich versucht:

ViewBag.Sport = new SelectList(db.AthleteTable.Distinct(), "ID", "Sport"); 

Oder:

ViewBag.Sport = new SelectList(db.AthleteTable, "ID", "Sport").Distinct(); 

CSHTML:

<div class="form-group"> 
    @Html.LabelFor(model => model.Sport, htmlAttributes: new { @class = "control-label col-md-2" }) 
     <div class="col-md-10"> 
      @Html.DropDownList("Sport", null, "-- Select Sport --", htmlAttributes: new { @class = "form-control" }) 
      @Html.ValidationMessageFor(model => model.Sport, "", new { @class = "text-danger" }) 
     </div> 
</div> 

Dies macht meine Dropdownlist, aber die Werte wiederholen so:

Baseball 
Baseball 
Basketball 
Basketball 
Hockey 
Hockey 

Was ich will:

Baseball 
Basketball 
Hockey 

Jede Hilfe sehr geschätzt wird.

UPDATE:

der Grund, warum meine Tabelle wie dieser ist, weil ich andere Dropdownlists erstellen und jeden Athleten durch Sport wie so trennen:

List<SelectListItem> lstAthletes = new List<SelectListItem>(); 

     using(var context = new ConnectionString()) 
     { 
      List<AthleteTable> lstAthletes = context.AthleteTable.ToList(); 
      var groups = lstAthletes.GroupBy(x => x.Sport); 
      foreach(var group in groups) 
      { 
       var slg = new SelectListGroup() { Name = group.Key }; 

       foreach(AthleteTable athlete in group) 
       { 
        SelectListItem item = new SelectListItem() { Text = athlete.Athlete, Value = athlete.ID.ToString(), Group = slg }; 
        lstAthletes.Add(item); 
       } 
      } 

     } 
+1

Ist "Sport" keine separate Geschichte in Ihrem Datensatz? Vielleicht möchten Sie die Denormalisierung Ihrer Daten in Betracht ziehen, wodurch diese (und möglicherweise andere Aufgaben) sauberer werden. –

Antwort

4

könnten Sie verwenden GroupBy:

var distinctSports = db.AthleteTable.GroupBy(a => a.Sport).Select(g => g.First()); 
ViewBag.Sport = new SelectList(distinctSports, "ID", "Sport"); 

Allerdings ist es seltsam, dass Sie die Sportarten aus der Athleten-Tabelle auswählen und die Athleten-ID dem Sportnamen zuordnen, die völlig unabhängig voneinander sind Verwenden Sie es ist die Athleten-ID nicht die Sport-ID.

Normalerweise sollten Sie eine Sport-Tabelle und einen Fremdschlüssel in Ihrer Athleten-Tabelle haben. Dann könnten Sie daraus auswählen und alle Sportarten wären einzigartig.

+0

Dies ist nicht mein richtiger Code .. Ich erstelle Beispiel aus der Spitze meines Kopfes, um meinen Punkt über –

+0

zu bekommen Auch wenn ich dein Beispiel lief, musste ich die 'g.First' zu' g.FirstOrDefault ändern 'funktioniert aber immer noch! –

+0

@BviLLe_Kid: Warum mussten Sie es in "FirstOrDefault" ändern? Es ist nicht möglich, dass eine Gruppe nicht vorhanden ist/nach "GroupBy" leer ist. –