LINQ to XML,ORM还是“完全不同”的东西?

时间:2009-01-20 14:24:46

标签: c# linq silverlight orm

我正在开发一个具有所有功能和限制的Silverlight项目。这是对以前产品的更新。为了快速推向市场,其目的是尽可能多地维护后端(Web服务,数据库等)。如果没有别的办法,我们要求只触及后端。我们主要专注于重写前端。很快就会有一个重要的行业会议,我们想要展示产品的早期外观。在官方发布之前可能还有一段时间做一些重新工作,但后端可能需要等到V2。

好的,所以我要做的就是使用MVVM模式和我负责的前端的数据绑定(MVVM模式由上面指定)。我有一个pre-existig Web服务,提供一些XML。该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,在我看来,我需要将其转换为自定义对象。正如您所看到的,有许多“Entry”项,MainEntry(ME)和Subentries(本例中为M1或M2),这些都将包含某些其他节点(例如,它们都将具有IE节点),它们可以包含0个或更多其他节点类型(例如,它们可以包含或不包含一个或多个NM节点,或者它们可以包含或不包含一个CF节点)。 Whihc意味着(至少对我而言)我无法直接绑定到XML,因为:

  1. 它违反了MVVM模式(我可以为演示证明这一点,但稍后需要重构)。
  2. 我无法将UI元素绑定到可能不存在给定项目的XML节点。
  3. 在某些情况下,我要将一个集合(例如一堆NM项目)翻译成格式化的strig用于显示目的,我认为这不是一件小事。
  4. 所以,我正在尝试理解将这个XML转换为可绑定对象的最佳方法,在我看来,这意味着将此XML转换为模型的对象,然后在该模型上覆盖视图模型。

    这可以通过LINQ to XML查询轻松完成,还是我真的进入了ORM的领域,如NHibernate或Entity Framework(请不要讨论WHICH ORM的神圣战争)? 我刚刚建立了我将用于UI的控件,我需要快速向我的经理演示 HOW 我将要处理翻译。

    所以,真正的问题:

    1. 需要 ORM吗?我并不反对使用它们,但我希望保持XAP文件的大小,并希望限制我(和我的队友)一次性学习需要学习的新技术的数量。
    2. 如果我确实需要一个,我可以保持文件大小,我可以使用EF或NHibernatge快速提升并有一个模型很快显示?我在这里说一个星期就有 SOMETHING ,它将从web服务获取输出并将其转换为对象,即使地图最初不完美,我需要展示一些进展。< / LI>
    3. 是否还有其他选项我不考虑可能更容易,限制修改现有代码(即网络服务)和产品可用结果的需要?

1 个答案:

答案 0 :(得分:9)

  

我需要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;
}