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

Ste*_*ard 3 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>
Run Code Online (Sandbox Code Playgroud)

所以,我的问题,因为我想使用MVVM模式将其绑定到UI,在我看来,我需要将其转换为自定义对象.正如您所看到的,有许多"Entry"项,MainEntry(ME)和Subentries(本例中为M1或M2),这些都将包含某些其他节点(例如,它们都将具有IE节点),它们可以包含0个或更多其他节点类型(例如,它们可以包含或不包含一个或多个NM节点,或者它们可以包含或不包含一个CF节点).Whihc意味着(至少对我而言)我无法直接绑定到XML,因为:

  1. 它违反了MVVM模式(我可以为演示证明这一点,但稍后需要重构).
  2. 我无法将UI元素绑定到可能不存在给定项的XML节点.
  3. 在某些情况下,我要将一个集合(例如一堆NM项目)翻译成一个格式化的strig用于显示目的,我认为这不是一件小事.

因此,我正在尝试理解将此XML转换为可绑定对象的最佳方法,在我看来,这意味着将此XML转换为模型的对象,然后在该模型上覆盖视图模型.

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

那么,真正的问题:

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

Amy*_*y B 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;
}
Run Code Online (Sandbox Code Playgroud)