首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用内部连接在XML元素中对结果进行分组

使用内部连接在XML元素中对结果进行分组
EN

Stack Overflow用户
提问于 2013-03-07 23:34:56
回答 1查看 600关注 0票数 0

我正在尝试理解如何组合LINQ- to -XML和LINQ-to-SQL查询,并执行联接。

具体地说,我有一个包含城市、县和州信息的SQL表,我可以用LINQ to SQL查询它,但是在同一个查询中,我希望连接具有相同州和/或县的SQL行,并生成一个XML作为输出的一部分。

下面是我的表的大致外观:

代码语言:javascript
复制
╔═════╦══════════════╦════════════════╦═══════╗
║ 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输出的样子。我希望join将具有相同县的所有城市分组为同一县节点下的节点,然后将州中的所有县分组为州节点的子节点。

代码语言:javascript
复制
<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,但是我不能获得嵌套为州的子节点的城市和县数据,并且我缺少连接部分,并且不清楚如何做到这一点。

代码语言:javascript
复制
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")

这是我得到的输出。如您所见,我正在获得数据库中所有城市、州和县的完整列表,而不是层次结构。

代码语言:javascript
复制
<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..
EN

回答 1

Stack Overflow用户

发布于 2013-03-08 18:21:29

你确实有几个独立的问题,首先是你不能生成一个分层的XML文件(假设我在编辑你的问题之前理解了你的初衷)。实际上,示例XML从一开始就没有层次化,因为在嵌套其下的子标记之前先结束标记。像你这样缩进并不是创建任何类型的子节点,只是让它看起来像。

我认为这就是您想要的XML:

代码语言:javascript
复制
<State>AK
  <County>ALEUTIANS EAST
    <City>YAKUTAT</city>
    <City>city-1</city>
  </County>
</State>

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

代码语言:javascript
复制
<State name = "AK">
  <County name = "ALEUTIANS EAST">
    <City>YAKUTAT</city>
    <City>city-1</city>
  </County>
</State>

生成嵌套的XML只需将XElement对象安排在彼此内部即可。

代码语言:javascript
复制
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")));

将生成具有我上面建议的结构的XML。

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

我不是一个LINQ-to-SQL的期望者,事实上不同的风格之间可能有副标题的差异,我不能百分之百地确定语法是否完全正确,但希望,如果它是关闭的,它仍然会把你引向正确的方向。

请注意,因为您正在创建XML文件,所以这不是LINQ-to-XML,LINQ用于查询源,而不是输出,而且由于您正在查询数据库,因此这是LINQ-to-SQL

代码语言:javascript
复制
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()));

第一个group语句将基于公共的县和州将所有数据库行分组到组中(有必要包括州,就像您排除它一样。Orange,FL和Orange,CA将一起分组。然后,第二个group语句将数据库行进一步分组为公共状态。您最终得到一个分组(称为stateGroup,它由同一县内的一组城市和同一城市中分组的县组成)。

将分组分解成适当的XML节点的select语句变得非常混乱,但它实际上写出了每个分组,以便到达我认为您想要的位置。

(您在问题中创建XDocument时也遗漏了XML声明,所以我在这里补充了这一点)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15275230

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档