2013-03-07 4 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

ОК, я задаюсь вопросом, почему модераторы закрыли этот вопрос, не думайте, что я буду тратить свое время на заданный риторический вопрос после регистрации ... Я использовал данные из другого сообщения, что только потому, что данные, касающиеся моего проекта имеет perosnal детали .... – user2141957

+0

@ user2141957 Это не модераторы, которые закрыли ваш вопрос, но 5 членов сообщества. Наиболее вероятная причина, по которой она была закрыта, заключалась в том, что вы действительно не задавали вопрос или, по крайней мере, так, как вы писали вопрос, очень сложно понять, что вы спрашиваете. Я думаю, что ваши вопросы могут быть спасены, но вам нужно дать некоторые разъяснения. В частности, что такое 'государство'? Это коллекция? Вы ссылаетесь на SQL, но нет никаких указаний на то, как это вступает в игру. – psubsee2003

+0

@ user2141957 одно предложение, которое я бы сделал, читает эту запись в блоге: [Написание идеального вопроса] (http://tinyurl.com/so-hints). Это очень хорошая статья, написанная одним из наших высокопоставленных членов о том, как написать хороший вопрос, чтобы получить хорошие ответы. Это очень полезно – psubsee2003

ответ

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 объектов внутри каждого другого

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, и тот факт, что между различными вариантами могут быть различия между субтитрами, я не уверен на 100%, что синтаксис будет правильным, но, надеюсь, если он он все равно заставит вас указывать в правильном направлении.

Обратите внимание, что только потому, что вы создаете XML-файл, это не LINQ-to-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, FL и Orange, CA будет сгруппирована вместе. Второй оператор группы затем группирует ваши строки базы данных дальше в общие состояния. В итоге вы получаете группировку (называемую stateGroup, которая состоит из из коллекции городов, которые в том же графстве и уездах, которые сгруппированы в одном городе.

Оператор select, чтобы разбить эту группировку на соответствующие узлы XML, становится очень грязным, но он эффективно записывает каждую из групп, чтобы добраться туда, куда, как я думаю, вы хотите отправиться.

(вы также пропустили декларацию XML при создании своего XDocument в своем вопросе, поэтому я добавил это здесь).

+0

благодарит кучу, чтобы дать новичкам такое подробное объяснение, вы не только разъяснили мое замешательство в отношении linq-xml, но и создали новый исходный вопрос. – user2141957

+0

@ user2141957, но теперь вы можете видеть, в чем разница, которую может решить хорошо сформулированный вопрос ... вопрос был возобновлен через 5 минут после того, как я закончил свое первоначальное редактирование. Вы жаловались на то, что потратили 30 минут на вопрос ... но, честно говоря, я обычно трачу, по крайней мере, столько времени, написание собственных вопросов на сайте. Это занимает много времени, чтобы получить хорошие вопросы. – psubsee2003

+0

@ user2141957 Обычно я не делаю этого по моим собственным ответам, но не забывайте поднимать, если вы сочтете это полезным, и отметьте ответный знак, если он решит проблему. – psubsee2003

Смежные вопросы