将 LINQ 填充的 ViewModel 从业务逻辑层返回到控制器 - MVC
Posted
技术标签:
【中文标题】将 LINQ 填充的 ViewModel 从业务逻辑层返回到控制器 - MVC【英文标题】:Return LINQ populated ViewModel from Business Logic Layer to Controller - MVC 【发布时间】:2017-10-25 04:36:49 【问题描述】:我有一个填充 StaffHierarchySearchViewModel 视图模型的 LINQ 查询。我正在尝试在我的业务逻辑层 (BLL) 中填充 StaffHierarchySearchViewModel 并将这些结果返回给我的控制器。当我尝试在我的方法中返回 results 值时,返回结果行出现错误。我收到以下错误:Cannot implicitly convert type 'System.Collections.Generic.IEnumerable<WebReportingToolDAL.Models.ViewModels.StaffHierarchySearchViewModel>' to 'WebReportingToolDAL.Models.ViewModels.StaffHierarchySearchViewModel'. An explicit conversion exists (are you missing a cast?)'
我尝试了其他解决方法,但似乎仍然无法让返回值起作用。
namespace WebReportingToolBLL
public class StaffHierarchySearch
private Collections_StatsEntities db = new Collections_StatsEntities();
public StaffHierarchySearchViewModel StaffHierarchySearchViewModel(string SearchString)
IEnumerable<StaffHierarchySearchViewModel> results = from sa in db.SecurityAccesses
join ss in db.SecuritySystems on sa.System equals ss.SystemID
join s in db.Staffs on sa.EmpID equals s.EmpID
join u in db.Units on s.UnitID equals u.UnitID
join h in db.Hierarchies on sa.EmpID equals h.EmpID
join t in db.Staffs on h.TeamID equals t.EmpID
where sa.ID == SearchString
select new WebReportingToolDAL.Models.ViewModels.StaffHierarchySearchViewModel
ID = sa.ID,
SystemName = ss.SystemName,
LastName = s.LastName,
FirstName = s.FirstName,
UnitName = u.UnitName,
EffectiveStart = h.EffStart,
EffectiveEnd = h.EffEnd,
ManagerFirstName = t.FirstName,
ManagerLastName = t.LastName,
Search = SearchString
;
return results;
【问题讨论】:
您似乎缩短了错误消息。请发布完整的消息。 好吧,你的函数必须返回一个虚拟机的 IEnumerable 而不是一个实例 我更新了我的帖子以显示完整的错误消息 【参考方案1】:public StaffHierarchySearchViewModel StaffHierarchySearchViewModel(string SearchString)
IEnumerable<StaffHierarchySearchViewModel> results = from sa in db.SecurityAccesses
/// snip
return results;
results
是一个IEnumerable<>
。该函数只想返回一个。
return results.FirstOrDefault();
会编译它,但这不是你想要的,因为你真的想要集合中的所有项目。
更改方法返回类型 - 以及您视图中的 @model
语句 - 以反映它是一个 IEnumerable。
【讨论】:
感谢@James Curran 的快速回复。你是对的,我确实需要归还整个收藏品。返回整个集合最有意义的返回类型是什么?IEnumerable<StaffHierarchySearchViewModel>
会很好。但是,由于这是从数据库中提取项目,您可能希望在打开数据库连接的时间返回到 minimzie 之前插入 .ToList()
。
好的 - 只是确保我理解。将 return results.FirstOrDefault() 替换为 return results.ToList() 或者您是说保留 return results.FirstOrDefault() 原样但在我的 LINQ 查询中添加 .ToList() ?
使用return results.ToList()
(并更改返回类型)
谢谢,詹姆斯。我在上面发布了完整的代码。感谢您的帮助!【参考方案2】:
按照@James Curran 所说,我将方法返回类型更新为List<StaffHierarchySearchViewModel>
并添加return results.ToList();
它似乎按预期工作。
namespace WebReportingToolBLL
public class StaffHierarchySearch
private Collections_StatsEntities db = new Collections_StatsEntities();
public List<StaffHierarchySearchViewModel> StaffHierarchySearchViewModel(string SearchString)
IEnumerable<StaffHierarchySearchViewModel> results = from sa in db.SecurityAccesses
join ss in db.SecuritySystems on sa.System equals ss.SystemID
join s in db.Staffs on sa.EmpID equals s.EmpID
join u in db.Units on s.UnitID equals u.UnitID
join h in db.Hierarchies on sa.EmpID equals h.EmpID
join t in db.Staffs on h.TeamID equals t.EmpID
where sa.ID == SearchString
select new WebReportingToolDAL.Models.ViewModels.StaffHierarchySearchViewModel
ID = sa.ID,
SystemName = ss.SystemName,
LastName = s.LastName,
FirstName = s.FirstName,
UnitName = u.UnitName,
EffectiveStart = h.EffStart,
EffectiveEnd = h.EffEnd,
ManagerFirstName = t.FirstName,
ManagerLastName = t.LastName,
Search = SearchString
;
return results.ToList();
【讨论】:
以上是关于将 LINQ 填充的 ViewModel 从业务逻辑层返回到控制器 - MVC的主要内容,如果未能解决你的问题,请参考以下文章
SwiftUI 从 ViewModel 预填充 TextField
使用 DataContext 从 LINQ 查询中填充 DataTable 的最快方法
如何从 ViewModel 对象填充选择器,设置为第一个元素的初始状态并处理选择选择器项的操作