LINQ to XML、ORM 或“完全不同”的东西?
Posted
技术标签:
【中文标题】LINQ to XML、ORM 或“完全不同”的东西?【英文标题】:LINQ to XML, ORM or something "Completely Different"? 【发布时间】:2009-01-20 14:24:46 【问题描述】:我正在从事一个 Silverlight 项目,该项目具有所需的所有功能和限制。这是对以前产品的更新。为了快速推向市场,其目的是尽可能多地维护后端(Web 服务、数据库等)。如果没有其他方法,我们要求它只接触后端。我们将主要专注于重写前端。很快就会有一个重要的行业会议,我们将在其中演示产品的早期外观。在正式发布之前可能有时间做一些返工,但后端可能需要等到 V2。
好的,所以我正在尝试将 MVVM 模式与我负责的前端的数据绑定一起使用(MVVM 模式由上面规定)。我有一个提供一些 XML 的预先存在的 Web 服务。该 XML 的示例如下所示:
<CODEBOOKINDEX>
<ME Words="1" Score="25" Highscore="1">Main Entry Item
<NM>attack</NM>
<NM>cardiac</NM>
<NM>chest</NM>
<NM>effort</NM>
<NM>heart</NM>
<NM>pectoris</NM>
<NM>syndrome</NM>
<NM>vasomotor</NM>
<IE>413.9</IE>
<M1 Words="1" Score="25">An M1 Item (Same as ME, just first level Child)
<IE>557.1</IE>
</M1>
<M1 Words="1" Score="25">Another M1 Item
<IE>443.9</IE>
<M2 Words="1" Score="25">An M2 Item (again same as ME, just a child of an M1 item)
<CF>Arteriosclerosis,extremities</CF>
<IE>440.20</IE>
</M2>
</M1>
</ME></CODEBOOKINDEX>
所以,我的问题是,由于我想使用 MVVM 模式将此绑定到 UI,因此在我看来,我需要将其转换为自定义对象。如您所见,有许多“条目”项,MainEntry (ME) 和子条目(本例中为 M1 或 M2),它们都将包含某些其他节点(例如,它们都将具有 IE 节点),它们可以包含 0 个或多个其他节点类型(例如,它们可以包含或不包含一个或多个 NM 节点,或者它们可以包含或不包含一个 CF 节点)。 Whihc 意味着(至少对我而言)我不能真正直接绑定到 XML,因为:
-
它违反了 MVVM 模式(我可能会为演示证明这一点,但以后必须重构)。
我无法真正将 UI 元素绑定到给定项目可能不存在的 XML 节点。
在某些情况下,我必须将一个集合(例如一堆 NM 项目)转换为格式化字符串以用于显示目的,我认为这不是一件小事。
所以,我正在尝试了解将此 XML 转换为可绑定对象的最佳方法,在我看来,这意味着将此 XML 转换为模型的对象,然后在该模型上覆盖视图模型。
这可以通过 LINQ to XML 查询轻松完成,还是我真的进入了诸如 NHibernate 或实体框架之类的 ORM 领域(请不要对哪个 ORM 进行圣战)? 我刚刚确定了我将为 UI 使用的控件,我需要尽快向我的经理演示如何我将处理翻译。
所以,真正的问题:
-
我是否需要 ORM?我不反对使用它们,但我希望 XAP 文件的大小保持较小,并希望限制我(和我的队友)需要一次性学习的新技术数量。
如果我确实需要一个,我可以减小文件大小吗?我可以使用 EF 或 NHibernatge 快速增加并很快展示一个模型吗?我说的是一周的时间,有SOMETHING,它将从网络服务中获取输出并将其转换为对象,即使最初的地图并不完美,我也需要展示一些进展。
是否还有其他我认为可能更容易的选项,限制修改现有代码(即 Web 服务)和产品可用结果的需要?
【问题讨论】:
【参考方案1】:我需要 ORM 吗?
没有。您没有映射到关系源,因此对象关系映射器无济于事。
使用Linq to Xml 完成它。
public CustomClass TranslateME(XElement source)
CustomClass result = new CustomClass();
result.Words = (int) source.Attribute("Words");
result.Score = (int) source.Attribute("Score");
XAttribute highScore = source.Attribute("HighScore");
result.HighScore = (highScore == null) ? 0 : (int) highScore;
result.NMs = source
.Elements("NM")
.Select(x => x.Value)
.ToList();
result.IE = source
.Element("IE").Value;
result.SubEntries = source
.Elements("M1")
.Select(x => TranslateM1(x))
.ToList();
return result;
【讨论】:
谢谢大卫。这有助于我了解 LINQ to XML 将如何完成任务,这意味着我仍然需要加强它,但它似乎有我需要的东西,所以我将花有限的时间朝那个方向前进。以上是关于LINQ to XML、ORM 或“完全不同”的东西?的主要内容,如果未能解决你的问题,请参考以下文章
用 LINQ to SQL 或 LINQ to EF 替换 NHibernate
Dapper扩展Dapper.Common框架 Linq To Sql 底层源码.net ORM框架