C# 使下拉列表与众不同

C# 使下拉列表与众不同,c#,asp.net-mvc-5,C#,Asp.net Mvc 5,数据库表: |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

数据库表:

|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
我只想在我的创建操作中创建一个包含
Sport
属性的下拉列表

我所尝试的:

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

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>
我想要的是:

Baseball
Basketball
Hockey
感谢您的帮助

更新:

我的表格之所以如此,是因为我可以创建其他下拉列表,并按运动项目将每个运动员分开,如下所示:

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

        }
List=newlist();
使用(var context=newconnectionString())
{
List=context.AthleteTable.ToList();
var groups=lst运动员.GroupBy(x=>x.Sport);
foreach(组中的var组)
{
var slg=new SelectListGroup(){Name=group.Key};
foreach(团体中的运动员)
{
SelectListItem item=new SelectListItem(){Text=Athletator.Athletator,Value=Athletator.ID.ToString(),Group=slg};
1.增加(项目);
}
}
}

您可以使用
GroupBy

var distinctSports = db.AthleteTable.GroupBy(a => a.Sport).Select(g => g.First());
ViewBag.Sport = new SelectList(distinctSports, "ID", "Sport");
但是,奇怪的是,您从运动员表中选择了运动项目,并将运动员id映射到运动名称,这完全不相关,因为这是运动员id而不是运动id


通常,您应该在运动员表中有一个
Sport
-表和一个外键。然后,您可以从中进行选择,所有运动都将是独一无二的。

您可以使用
GroupBy

var distinctSports = db.AthleteTable.GroupBy(a => a.Sport).Select(g => g.First());
ViewBag.Sport = new SelectList(distinctSports, "ID", "Sport");
但是,奇怪的是,您从运动员表中选择了运动项目,并将运动员id映射到运动名称,这完全不相关,因为这是运动员id而不是运动id


通常,您应该在运动员表中有一个
Sport
-表和一个外键。然后你可以从中选择,所有的运动都是独一无二的。

在你的数据集中,
Sport
不是一个单独的故事吗?您可能想考虑对数据进行非规范化处理,这会使(和可能其他任务)更干净。<代码>体育< /代码>不是您的数据集中的单独的故事吗?您可能想考虑对数据进行反编译,这会使(还有其他任务)更干净。这不是我真正的代码。我正在从头开始创建示例,以获得我的观点。因此,当我运行您的示例时,我必须将
g.First
更改为
g.FirstOrDefault
,但仍然有效@孩子:你为什么要把它改成第一个默认值?在
GroupBy
之后,不可能没有组/组为空。这不是我真正的代码。。我正在从头开始创建示例,以获得我的观点。因此,当我运行您的示例时,我必须将
g.First
更改为
g.FirstOrDefault
,但仍然有效@孩子:你为什么要把它改成第一个默认值?
GroupBy
之后不可能没有组/组为空。
var distinctSports = db.AthleteTable.GroupBy(a => a.Sport).Select(g => g.First());
ViewBag.Sport = new SelectList(distinctSports, "ID", "Sport");