将 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&lt;&gt;。该函数只想返回一个。

return results.FirstOrDefault(); 会编译它,但这不是你想要的,因为你真的想要集合中的所有项目。

更改方法返回类型 - 以及您视图中的 @model 语句 - 以反映它是一个 IEnumerable。

【讨论】:

感谢@James Curran 的快速回复。你是对的,我确实需要归还整个收藏品。返回整个集合最有意义的返回类型是什么? IEnumerable&lt;StaffHierarchySearchViewModel&gt; 会很好。但是,由于这是从数据库中提取项目,您可能希望在打开数据库连接的时间返回到 minimzie 之前插入 .ToList() 好的 - 只是确保我理解。将 return results.FirstOrDefault() 替换为 return results.ToList() 或者您是说保留 return results.FirstOrDefault() 原样但在我的 LINQ 查询中添加 .ToList() ? 使用return results.ToList()(并更改返回类型) 谢谢,詹姆斯。我在上面发布了完整的代码。感谢您的帮助!【参考方案2】:

按照@James Curran 所说,我将方法返回类型更新为List&lt;StaffHierarchySearchViewModel&gt; 并添加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 对象填充选择器,设置为第一个元素的初始状态并处理选择选择器项的操作

Flutter ViewModel 旧数据正在重新填充(使用 Provider)

如何将通用存储库(或业务逻辑层)注入 ViewModel

如何使用 List<object> 将对象值添加到 viewmodel