无法将类型 'System.Linq.IQueryable<System.Web.Mvc.SelectListItem>' 隐式转换为 'System.Web.Mvc.SelectList'

Cannot implicitly convert type 'System.Linq.IQueryable<System.Web.Mvc.SelectListItem>' to 'System.Web.Mvc.SelectList'

我的控制器中有一个方法:

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

我在下面一行标题中收到错误消息:

model.MajSecList = db.EngineOIRFRs.Select(m => new SelectListItem { Value = m.MajorSection.ToString(), Text = m.MajorSection });

它说存在一个明确的转换,但到目前为止我的搜索还没有找到一个。关于如何解决这个问题的任何想法?

你有两个问题(至少)

首先,你也Select类型不对。 MajSecList 的类型为 SelectList,但您明确选择了 SelectListItem。您需要更新 Select.

其次Select没有立即执行。您需要使用 ToListFirstOrDefault 之类的东西(取决于您的需要)来实际执行查询和 return 结果:

model.MajSecList = db.EngineOIRFRs.Select(m => new SelectListItem { Value = m.MajorSection.ToString(), Text = m.MajorSection }).ToList();

这个想法是您可以构建一个查询,将 SelectWhere 等操作链接在一起,而无需每次都执行查询。

完成查询并使用 FirstOrDefaultToList(或其他)后,它实际上会执行查询并 return 返回结果。

或者只是做你正在做的事情,然后将查询传递给 SelectList:

的构造函数
model.MajSecList = new SelectList(db.EngineOIRFRs.Select(m => new SelectListItem { Value = m.MajorSection.ToString(), Text = m.MajorSection }));