4

我有一个看起来像这样的视图:

替代文字

我试图弄清楚我应该如何为这个视图表示我的 ViewModel。每个“机构”可以有多个“业务单位”,每个“业务单位”可以有多个“客户”。

在数据库中,我很容易用代理表、业务单元表和客户表的映射表和外键来表示这一点。

但是,现在我需要使用 LINQ 从数据库中查询这些数据,然后构造一个表示这种树状结构的 ViewModel 对象,以便我的 View 可以呈现它。

谁能给我关于我应该使用什么数据结构的提示,或者我的 ViewModel 在 C# 代码中的这种分层结构可能看起来像什么?我需要创建我的 ViewModel 对象来传递给这个视图。

任何有关如何表示 ViewModel 的建议都值得赞赏!

4

3 回答 3

1

只需在您的视图数据中存储一个 List 实例?

public class Agency
{
   public List<BusinessUnit> Units;
   public string Name;
   public int NumberOfAccounts
   {
      get 
      {
         int ret = 0;
         foreach(BusinessUnit unit in units)
            ret += unit.NumberOfAccounts;
         return ret;
      }
   }
   // ... continue this strategy for other properties
}
public class BusinessUnit
{
   public List<Client> clients;
   public string Name;
   public int NumberOfAccounts
   {
      get 
      {
         int ret = 0;
         foreach(Client client in clients)
            ret += client.NumberOfAccounts;
         return ret;
      }
   }
   // ... continue this strategy for other properties

}
public class Client
{
   public string Name;
   public int NumberOfAccounts;
}
于 2009-06-19T16:19:27.797 回答
0

我最近一直在使用“ADO .Net 实体数据模型”模板来控制与支持层次结构数据的 MSSQL 数据库的连接,并且运行良好。

您可以将表示层直接绑定到数据模型。

如果您的密钥在数据库中设置正确,则可以快速启动和运行..我认为它还需要 ADO.Net 3.5

创建 ADO.NET Entity Framework 实体

MS 实体信息

于 2009-06-19T16:01:20.637 回答
0

假设您的 Linq2Sql 实现与数据库具有相同的关系(如果您确实拖放到设计器,他们肯定会这样做),这就是我将如何处理它。

我将创建一个代理类型的强类型部分视图,它代表每个部分(代理,在你的情况下),称之为 AgencyReportSection.ascx。这种控制将使代理机构迭代其业务部门,进而迭代其客户。

无论您在哪里打包数据,都可以执行以下操作:

DataContext context = new DataContext();
DataLoadOptions options = new DataLoadOptions();
options.LoadWith<Agency>(a => a.BusinessUnit);
options.LoadWith<BusinessUnit>(b => b.Client); 

context.LoadOptions = options;

这将为您提供的是,当上下文获得代理时,它将遵循定义的关系并为您提供这些对象。所以你得到:

Agency a = context.Agency.FirstOrDefault();
IEnumerable<BusinessUnit> units = a.BusinessUnits;
IEnumerable<Client> clients = units.Clients;

您的视图可以执行以下操作:

<% foreach(var agency in agencies)%{>
<% Html.RenderPartial("AgencyReportSection"); %> 
<%}%>

您执行数据加载选项的原因是为了避免视图中的延迟加载,让模型打包所有必要的数据。

我希望我已经正确理解了你的问题......

于 2009-06-20T01:30:49.953 回答