【问题标题】:Return LINQ populated ViewModel from Business Logic Layer to Controller - MVC将 LINQ 填充的 ViewModel 从业务逻辑层返回到控制器 - 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 而不是一个实例
  • 我更新了我的帖子以显示完整的错误消息

标签: linq model-view-controller viewmodel ienumerable business-logic-layer


【解决方案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();
    }

}

}

【讨论】:

    猜你喜欢
    • 2017-08-08
    • 1970-01-01
    • 2012-04-02
    • 1970-01-01
    • 1970-01-01
    • 2014-08-05
    • 2021-03-28
    • 1970-01-01
    • 2010-12-18
    相关资源
    最近更新 更多