2013-03-07 51 views
0

我想了解如何将LINQ-to-XML和LINQ-to-SQL查询结合起来并执行连接。在内部连接的XML元素中对结果进行分组

具体来说,我有一个SQL表,其中包含城市,县和州的信息,我可以查询它与LINQ to SQL,但在同一个查询中,我想加入具有相同的SQL行州和/或县,并生成XML作为输出的一部分。

这里是大约什么我的表如下所示:

╔═════╦══════════════╦════════════════╦═══════╗ 
║ IDX ║  CITY  ║ COUNTY  ║ STATE ║ 
╠═════╬══════════════╬════════════════╬═══════╣ 
║ 1 ║ YAKUTAT  ║ ALEUTIANS EAST ║ AK ║ 
║ 2 ║ city-1  ║ ALEUTIANS EAST ║ AK ║ 
║ 3 ║ city-2  ║ ALEUTIANS EAST ║ AK ║ 
║ 4 ║ city-3  ║ ALEUTIANS WEST ║ AK ║ 
║ 5 ║ city-4  ║ ALEUTIANS WEST ║ AK ║ 
║ 6 ║ city-5  ║ ALEUTIANS WEST ║ AK ║ 
║ 7 ║ xyz   ║ ANCHORAGE  ║ AK ║ 
║ 8 ║ abc   ║ BETHEL   ║ AK ║ 
║ 9 ║ lmnop  ║ WYOMING  ║ NY ║ 
║ 10 ║ pqrst  ║ WARSAW   ║ NY ║ 
║ 11 ║ defg   ║ WARSAW   ║ NY ║ 
╚═════╩══════════════╩════════════════╩═══════╝ 

这就是想什么我我的XML输出的样子。我希望加入将同一县的所有城市分组为同一个县节点下的节点,然后将所有县作为状态节点的子节点进行分组。

<State>AK</State> 
    <County>ALEUTIANS EAST</County> 
    <City>YAKUTAT</City> 
    <City>city-1</City> 
    <City>city-2</City> 
    <County>ALEUTIANS WEST</County> 
    <City>city-3</City> 
    <City>city-4</City> 
    <City>city-5</City> 
    <County>ANCHORAGE</County> 
    <City>xyz</City> 
    <County>BETHEL</County> 
    <City>abc</City> 
<State>NY</State> 
    <County>WYOMING</County> 
    <City>lmnop</City> 
    <County>WARSAW</County> 
    <City>pqrst</City> 
    <City>defg</City> 

我有这个部分的工作,我能够从我的数据库成功地选择行,我能写输出作为XML,但我不能让嵌套作为子节点的市,县数据状态,我错过了加入部分,并不清楚如何做到这一点。

XDocument xDoc = new XDocument(new XElement("States", 
    (from states in state.Database 
    select new XElement(new XElement("State",states.State), 
      new XElelment("County",states.County), 
      new XElelment("City",state.City)))); 

xDoc.Save("C:\\states.xml") 

这是我得到的输出。正如你所看到的,我在没有层次结构的情况下获得了数据库中所有城市,州和县的完整列表。

<State>AK</State> 
<County>ALEUTIANS EAST</County> 
<City>YAKUTAT</City> 
<State>AK</State> 
<County>ALEUTIANS EAST</County> 
<City>city-1</City> 
<State>AK</State> 
<County>ALEUTIANS EAST</County> 
<City>city-2</City> 
<State>AK</State> 
<County>ALEUTIANS WEST</County> 
<City>city-3</City> 
<State>AK</State> 
<County>ALEUTIANS WEST</County> 
<City>city-4</City> 
....and so on.. 
+0

ok我想知道为什么版主们关闭了这个问题,你是否认为我会浪费我的时间在注册后问一个修辞问题......我使用了来自不同职位的数据,这只是因为与我的项目有关的数据有perosnal细节.... – user2141957 2013-03-07 21:04:52

+0

@ user2141957这不是版主谁关闭你的问题,但社区的5个成员。关闭它的最可能的原因是因为你确实没有提出问题,或者至少是你写这个问题的方式,所以很难弄清楚你问的是什么。我认为你的问题可能是可挽救的,但你需要提供一些澄清。具体来说,什么是“国家”?它是一个集合吗?你引用了一个SQL,但没有迹象表明这是如何发挥作用的。 – psubsee2003 2013-03-08 00:51:11

+0

@ user2141957我会做的一个建议是阅读这个博客条目:[写出完美的问题](http://tinyurl.com/so-hints)。这是一篇非常好的文章,由我们的一位最高级别的成员撰写,就如何写出一个很好的问题来获得良好的答案。这是非常有帮助 – psubsee2003 2013-03-08 00:53:29

回答

0

你真的有几个不同的问题,第一个是你不能够产生分层式XML文件(假设我理解你的原意之前,我编辑你的问题)。实际上,您的示例XML甚至没有层次结构,因为在嵌套下面的预期子标记之前关闭标记。像你在做的缩进不是创建任何类型的子节点,只是让它看起来像。

这就是我想你想你的XML看起来像:

<State>AK 
    <County>ALEUTIANS EAST 
    <City>YAKUTAT</city> 
    <City>city-1</city> 
    </County> 
</State> 

但混合简单类型如复杂的类型,如在同一节点中的其他节点的字符串可以非常混乱。我可以建议修改结构以使用属性,从而消除一些令人困惑的层次结构。像这样的结构会更普遍接受:

<State name = "AK"> 
    <County name = "ALEUTIANS EAST"> 
    <City>YAKUTAT</city> 
    <City>city-1</city> 
    </County> 
</State> 

生成嵌套的XML仅仅是安排对方

XElement stateElement = new XElement("State", new XAttribute("name", "AK"), 
          new XElement("County", new XAttribute("name", "ALEUTIANS EAST"), 
           new XElement("City", "YAKUTAT"), 
           new XElement("City", "city-1"))); 

内你XElement对象将产生与结构的XML我提出的问题以上。

您缺少的第二部分是连接。由于所有内容都位于同一个表中,因此您实际上正在查找组查询,因为您希望将单个共同父项下的子元素组合在一起。

我不是LINQ到SQL的期望,也可能是不同风格之间的字幕差异的事实,我不是100%确定语法将完全正确,但希望如果它是关闭,它仍然会让你指向正确的方向。

请注意,仅仅因为你正在创建一个XML文件,这不是LINQ到XML,LINQ是关于查询源而不是输出,并且因为你正在查询你的数据库,所以这是LINQ-to- SQL

var query = from states in state.Database 
      group states by new { states.State, states.County } into countyGroup 
      group countyGroup by countyGroup.Key.State into stateGroup 
      select new XElement("State", new XAttribute("name", stateGroup.Key), 
         stateGroup.Select(st => new XElement("County", new XAttribute("name", st.Key.County), 
         st.Select(city => new XElement("City", city.City))))); 

var xdoc = new XDocument(new XDeclaration("1.0", "UTF-8", null), 
         new XElement("States", query.ToArray())); 

第一组语句将组中的所有数据库中的行成组基于一个共同的县和国家(这是必要的,包括国家,如果你排除橙色,佛罗里达和Orange之内的城市, CA将被分组在一起,第二组语句会将您的数据库行进一步分组为常见状态,最终得到一个分组(称为stateGroup,它由在同一个县的城市集合,以及在同一个城市集中的县。

select语句将该分组分解为适当的XML节点变得非常混乱,但它有效地写出每个分组以便到达我想要去的地方。

(当你在你的问题中创建你的XDocument时,你也错过了XML声明,所以我在这里添加了这个)。

+0

感谢大家给新手这样一个详细的解释,你不仅澄清了我对linq-xml的困惑,而且更好地重构了我原来的问题。 – user2141957 2013-03-08 16:21:52

+0

@ user2141957但是现在你可以看到一个很好的框架问题可以做什么的区别......在完成我的初始编辑5分钟后,问题重新打开。你抱怨在这个问题上花了30分钟......但说实话,我通常花费了那么多时间在网站上写下自己的问题。得到一个好问题需要很长时间。 – psubsee2003 2013-03-08 16:26:59

+0

@ user2141957我通常不会在自己的答案中这样做,但如果您发现它有帮助,请不要忘记加注,并检查答案标记是否解决了问题。 – psubsee2003 2013-03-08 16:27:30

相关问题