C# 无法隐式转换类型';系统Linq.IQueryable<;System.Web.Mvc.SelectListItem>';至';System.Web.Mvc.SelectList';
我的控制器中有一个方法:C# 无法隐式转换类型';系统Linq.IQueryable<;System.Web.Mvc.SelectListItem>';至';System.Web.Mvc.SelectList';,c#,asp.net-mvc,linq,iqueryable,selectlistitem,C#,Asp.net Mvc,Linq,Iqueryable,Selectlistitem,我的控制器中有一个方法: private void ConfigureViewModel(EngineOIRemovalsViewModel model) { model.MajSecList = db.EngineOIRFRs.Select(m => new SelectListItem { Value = m.MajorSection.ToString(), Text = m.MajorSection }); if (model
private void ConfigureViewModel(EngineOIRemovalsViewModel model)
{
model.MajSecList = db.EngineOIRFRs.Select(m => new SelectListItem { Value = m.MajorSection.ToString(), Text = m.MajorSection });
if (model.SelectedMajorSection != null)
{
IEnumerable<EngineOIRFR> Areas = db.EngineOIRFRs.Where(l => l.MajorSection == model.SelectedMajorSection);
model.AreaList = new SelectList(Areas);
}
else
{
model.AreaList = new SelectList(Enumerable.Empty<SelectListItem>());
}
if (model.SelectedArea != null)
{
IEnumerable<EngineOIRFR> SubAreas = db.EngineOIRFRs.Where(l => l.Area == model.SelectedArea);
model.SubAreaList = new SelectList(SubAreas);
}
else
{
model.SubAreaList = new SelectList(Enumerable.Empty<SelectListItem>());
}
if (model.SelectedArea != null)
{
IEnumerable<EngineOIRFR> Failures = db.EngineOIRFRs.Where(l => l.SubArea == model.SelectedSubArea);
model.FailureList = new SelectList(Failures);
}
else
{
model.FailureList = new SelectList(Enumerable.Empty<SelectListItem>());
}
}
它说有一个明确的转换存在,但到目前为止,我的搜索还没有找到一个。有没有办法解决这个问题 您有两个问题(至少)
首先,您也没有选择正确的类型MajSecList
的类型为SelectList
,但您正在显式地选择SelectListItem
。您需要更新选择
秒,选择
不会立即执行。您需要使用类似于ToList
或FirstOrDefault
(取决于您的需要)的方法来实际执行查询并返回结果:
model.MajSecList = db.EngineOIRFRs.Select(m => new SelectListItem { Value = m.MajorSection.ToString(), Text = m.MajorSection }).ToList();
其思想是,您可以构建一个查询,将Select
或Where
等操作链接在一起,而无需每次执行查询
构建完查询并使用FirstOrDefault
或ToList
(或其他)后,它将实际执行查询并返回结果
或者只需执行下面的操作,并将查询传递给SelectList
的构造函数:
model.MajSecList = new SelectList(db.EngineOIRFRs.Select(m => new SelectListItem { Value = m.MajorSection.ToString(), Text = m.MajorSection }));
实际上,OP需要一个集合,而不是第一项。这也不能解决问题,因为SelectListItem
不是SelectList
。另外,请注意,OP在错误行的正下方正确执行了此操作,并且此答案应该匹配that@GabrielLuci最后一次编辑对我来说似乎是正确的答案。@GabrielLuci在结尾添加.ToList()时给出了一个不同的错误“无法将类型'System.Collects.Generic.List'隐式转换为'System.Web.Mvc.SelectList',但根据您的其他建议将查询传递给SelectList的构造函数!”!非常感谢大家!您的最后一行代码错误-(并且在视图中将生成所有选项,文本和值为“System.Web.Mvc.SelectListItem”
)我不理解这个问题。使用errorADropDownListFor()方法,您可以在行的正下方正确地执行此操作,并使用一个
IEnemerable`生成选项。您的FailureList
属性应该就是这样(而不是SelectList
,它只是IEnumerable
的包装器),如果您将SelectList
构造函数用于复杂对象的集合,还需要指定用于选项值和文本的属性名称
model.MajSecList = new SelectList(db.EngineOIRFRs.Select(m => new SelectListItem { Value = m.MajorSection.ToString(), Text = m.MajorSection }));