ADO Linq to xml

本文关键字:xml to Linq ADO | 更新日期: 2023-09-27 18:07:06

我正在编写一个程序,通过ADO数据上下文,我正在运行一个使用组类并返回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输出示例(使用酒吧样本db)

<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>

ADO Linq to xml

您正在提供一个返回序列作为属性值的查询。我的猜测是,您希望有一个结果,在这种情况下,您只需要将其更改为:

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))
 )