我有一个看起来像这样的观点:
我正在试图弄清楚我应该如何为这个视图代表我的ViewModel。每个“代理商”可以有多个“业务单位”,每个“业务单位”可以有几个“客户”。
在数据库中,我可以使用映射表和代理,BusinessUnit和Client表的外键轻松表示这一点。
但是,现在我需要使用LINQ从数据库中查询这些数据,然后构造一个表示这种树状结构的ViewModel对象,以便我的View可以呈现它。
任何人都可以给我一些关于我应该使用什么数据结构的提示,或者我的ViewModel在C#代码中对于这种层次结构的看法?我需要创建我的ViewModel对象以传递给该视图。
欢迎任何有关如何表示ViewModel的建议!
答案 0 :(得分: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;
}
答案 1 :(得分:0)
我最近使用“ADO .Net实体数据模型”模板来控制与支持层次结构数据的MSSQL数据库的连接,并且它一直运行良好。
您可以直接将表示层与数据模型联系起来。
如果您的密钥在数据库中设置正确,则可以快速启动并运行..我认为它还需要ADO.Net 3.5
答案 2 :(得分: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"); %>
<%}%>
您正在执行数据加载选项的原因是为了避免视图中的延迟加载,让模型打包所有必要的数据。
我希望我能正确理解你的问题......