2011-08-28 2 views
0

J'écris un prgm qui via ADO datacontext, j'exécute une requête sur la base de données qui utilise une classe de groupe et retourne un document xml. Je suis en mesure d'obtenir le code XML au travail, mais le XAttribute("pub_id", from p in g select new { p.Pubs_id }) donne:ADO Linq à xml

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

ci-dessous est le code:

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");  
sortie

échantillon xml souhaité (en utilisant échantillon pubs 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> 
+0

ce que vous avez dit m'a fait penser, il semble que j'ai besoin pub_id dans le cadre de la clé, je l'ai fait ce qui suit, et cela a fonctionné – SKatz

+0

groupe b par les nouvelles {b.Title1, b.Pubs_id} en g – SKatz

+0

thnks pour votre aide – SKatz

Répondre

2

Vous fournissez une requête renvoyant une séquence en tant que valeur d'un attribut. Je suppose que vous y attendez d'être un seul résultat, auquel cas il vous suffit de changer pour:

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

Ou encore:

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

Ce n'est pas vraiment clair si ce est ce que vous attendez cependant - mais c'est le problème. LINQ to XML appelle ToString sur votre requête, et vous voyez le résultat de cela. Changez le deuxième argument constructeur en quelque chose qui donne une seule valeur, cependant vous devez le faire.

Je pense que vous constaterez que si vous indentez votre code plus clairement, cela rendra plus évident ce qui se passe - pour le moment, ce n'est pas vraiment clair, juste en le regardant. Je réécrire votre requête comme il est prévu dans la question:

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

merci pour la réponse rapide, en faisant ce qui précède je reçois une erreur de débogage: la séquence contient plus d'un élément – SKatz

+0

@SKatz: Ok, donc il y a deux ou plus d'éléments ... quelle valeur voulez-vous dans l'attribut? Il est important de comprendre le problème ici - jusqu'à ce que vous le fassiez, vous ne serez pas en mesure de trouver la solution. Le problème est que vous essayez actuellement de fournir plusieurs valeurs à un attribut - mais un attribut ne prend jamais qu'une seule valeur. Je vais me coucher maintenant, mais si tout cela ne vous aide pas, laissez plus de détails et je vous aiderai le matin. –

+0

thnks, j'ai ajouté le sifflet xml de la sortie – SKatz