.NET - ORM和所有可能的组合 - ViewModel?

时间:2009-08-27 17:57:38

标签: .net linq nhibernate orm subsonic

您如何使用ORM解决此问题? 这是一个假设(简化)的例子:

我有一张城市表:
1 - 纽约
2 - 伦敦
3 - 旧金山
4 - 新奥尔良

我有一张分数表: (第一列唯一主键,第二个月代码,第三个FK到城市,第四个分数(int))
1 - 352 - 1 - 9
2 - 352 - 2 - 10

对于352个月,仅提及纽约和伦敦。

当我在用户界面中向用户展示时,我想要一个显示本月所有4个城市的网格。并且为San Fran和New Orleans城市提供空白(空白)。

使用ORM的最佳方法是什么?以“模型”形式返回Business Objects,然后将它们转换为“viewmodel”形式?你是如何处理ORM中的类似情况的?我之前在ADO.NET中使用我的SQL语句处理过这个问题,但是在ORM中从未做过这种事情,我正在寻找建议,指导或方法。

2 个答案:

答案 0 :(得分:2)

我们实际上实践了一种命令查询分离(Greg Young版本 - 而不是Meyer版本),所以我们至少会使用NHibernate ICriteria来选择我们想要的细节,然后使用AliasToBeanTransformer将它们直接注入DTO。

对于我们最复杂的实体,我们实际上有一个单独的表格,屏幕需要显示折叠成单行(也称为OLAP)的所有详细信息。然后,我们可以直接针对该表运行查询,这会超出加载复杂实体的成本,该实体包含的信息比屏幕需要的信息多得多。

答案 1 :(得分:0)

我使用LINQ来映射域对象以查看模型。 (我使用实体框架,但该技术适用于任何具有良好LINQ支持的ORM。)首先编写POCO视图模型,然后投影到它上面:

var pm = from c in Context.Cities
         let score = c.Scores.Where(s => s.MonthCode == selectedMonthCode).FirstOrDefault()
         select new CityScoresPresentation
         {
             City = c.Name,
             Score = score.Score
         };

这是LINQ to Entities。 LINQ to SQL的工作原理与此类似。 YMMV与其他ORMs LINQ实现。

我强烈建议使用视图模型,而不是将视图绑定到支持ORM的类型。