ADO Linq в xml - PullRequest
       16

ADO Linq в xml

0 голосов
/ 29 августа 2011

Я пишу prgm, что с помощью ADO datacontext я выполняю запрос к базе данных, которая использует выражение группы и возвращает документ XML. Я могу заставить XML работать, но XAttribute("pub_id", from p in g select new { p.Pubs_id }) дает:

System.Linq.Enumerable+WhereSelectEnumerableIterator`2[Pubs.BookStore+BookResults,<>f__AnonymousType1`1[System.String]]

ниже указан код:

XDocument xdoc = new XDocument(new XElement("reports",
 from b in bookResults 
 group b by b.Title1 into g 
 select new XElement("book", 
     new XAttribute("pub_id", from p in g select new { p.Pubs_id }), 
     new XElement("Title", g.Key), 
     from bk in g 
     select new XElement("Name", new XAttribute("au_id", bk.Au_id), bk.Name)) 
 ) 

xdoc.Save("Books.xml");    

желаемый пример вывода в формате xml (с использованием образца базы данных pubs)

<reports>
  <book pub_id="1389">
    <Title>The Busy Executive's Database Guide</Title>
    <Name au_id="409-56-7008">Bennet,Abraham</Name>
    <Name au_id="213-46-8915">Green,Marjorie</Name>
  </book>
  <book pub_id="0877">
    <Title>Fifty Years in Buckingham Palace Kitchens</Title>
    <Name au_id="648-92-1872">Blotchet-Halls,Reginald</Name>
  </book>
  <book pub_id="0877">
    <Title>The Gourmet Microwave</Title>
    <Name au_id="722-51-5454">DeFrance,Michel</Name>
    <Name au_id="899-46-2035">Ringer,Anne</Name>
  </book>

1 Ответ

2 голосов
/ 29 августа 2011

Вы предоставляете запрос, возвращающий последовательность в качестве значения атрибута. Я предполагаю, что вы ожидаете, что будет один результат, и в этом случае вам просто нужно изменить его на:

new XAttribute("pub_id", (from p in g select new { p.Pubs_id }).Single())

Или даже:

new XAttribute("pub_id", (from p in g select p.Pubs_id).Single())

Не совсем понятно, действительно ли это , что вы ожидаете, - но это проблема. LINQ to XML вызывает ToString по вашему запросу, и вы видите результат этого. Измените второй аргумент конструктора на что-то, что дает единственное значение, однако вам нужно это сделать.

Я подозреваю, что вы обнаружите, что, если вы сделаете отступ в своем коде более четко, это сделает более очевидным, что происходит - в настоящий момент не совсем ясно, просто посмотреть на него. Я бы переписал ваш запрос, как указано в вопросе, как:

 from b in bookResults
 group b by b.Title1 into g
 select new XElement("book",
     new XAttribute("pub_id", from p in g select new { p.Pubs_id }),
     new XElement("Title", g.Key),
     from bk in g
     select new XElement("Name", new XAttribute("au_id", bk.Au_id), bk.Name))
 )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...