2010-08-02 8 views
0

je la structure de tableau suivant:Linq - Interroger une table et retour des résultats en XML

CREATE TABLE [Report].[MesReport](
    [MesReportID] [int] IDENTITY(1,1) NOT NULL, 
    [ParentID] [int] NOT NULL, 
    [ReportTitle] [nvarchar](80) NOT NULL, 
    [ReportName] [nvarchar](80) NOT NULL, 
    [DatabaseServer] [nvarchar](80) NOT NULL, 
    [DatabaseName] [nvarchar](50) NOT NULL, 
    [Login] [nvarchar](80) NOT NULL, 
    [ReportFile] [varbinary](max) NULL 

Je veux créer une requête Linq qui interrogera ce tableau et de générer le code XML suivant. Quelqu'un peut-il aider avec cela?

<MesReports> 
    <MesReport> 
     <ReportTitle>Mes to Sap Reconciliation Reports</ReportTitle> 
     <ReportName>None</ReportName> 
     <DatabaseServer>None</DatabaseServer> 
     <Database>None</Database> 
     <Login>None</Login> 
     <MesReportId>1</MesReportId> 
     <ParentId>-1</ParentId> 
    </MesReport> 
    <MesReport> 
     <ReportTitle>Finished Goods</ReportTitle> 
     <ReportName>None</ReportName> 
     <DatabaseServer>None</DatabaseServer> 
     <Database>None</Database> 
     <Login>None</Login> 
     <MesReportId>2</MesReportId> 
     <ParentId>1</ParentId> 
    </MesReport> 
    <MesReport> 
     <ReportTitle>Semi-Finished Goods</ReportTitle> 
     <ReportName>None</ReportName> 
     <DatabaseServer>None</DatabaseServer> 
     <Database>None</Database> 
     <Login>None</Login> 
     <MesReportId>3</MesReportId> 
     <ParentId>1</ParentId> 
    </MesReport> 
    <MesReport> 
     <ReportTitle>Warranty Reports</ReportTitle> 
     <ReportName>None</ReportName> 
     <DatabaseServer>None</DatabaseServer> 
     <Database>None</Database> 
     <Login>None</Login> 
     <MesReportId>4</MesReportId> 
     <ParentId>-1</ParentId> 
    </MesReport> 
    <MesReport> 
     <ReportTitle>Box - PBG</ReportTitle> 
     <ReportName>Warranty Box - PBG</ReportName> 
     <DatabaseServer>MyServer</DatabaseServer> 
     <Database>MESProduction</Database> 
     <Login>6QDI+IoQbkZKJpVBcRJcNtoqR62606Q2</Login> 
     <MesReportId>5</MesReportId> 
     <ParentId>4</ParentId> 
    </MesReport> 
    <MesReport> 
     <ReportTitle>Box - FFO</ReportTitle> 
     <ReportName>Warranty Box - FFO</ReportName> 
     <DatabaseServer>MyServer</DatabaseServer> 
     <Database>MESProduction</Database> 
     <Login>6QDI+IoQbkZKJpVBcRJcNtoqR62606Q2</Login> 
     <MesReportId>6</MesReportId> 
     <ParentId>4</ParentId> 
    </MesReport> 
    <MesReport> 
     <ReportTitle>Bin Count - PBG</ReportTitle> 
     <ReportName>Bin Count - PBG</ReportName> 
     <DatabaseServer>MyServer</DatabaseServer> 
     <Database>MESProduction</Database> 
     <Login>6QDI+IoQbkZKJpVBcRJcNtoqR62606Q2</Login> 
     <MesReportId>7</MesReportId> 
     <ParentId>4</ParentId> 
    </MesReport> 
    <MesReport> 
     <ReportTitle>Bin Count - FFO</ReportTitle> 
     <ReportName>Bin Count - FFO</ReportName> 
     <DatabaseServer>MyServer</DatabaseServer> 
     <Database>MESProduction</Database> 
     <Login>6QDI+IoQbkZKJpVBcRJcNtoqR62606Q2</Login> 
     <MesReportId>8</MesReportId> 
     <ParentId>4</ParentId> 
    </MesReport> 
</MesReports> 
+0

Avez-vous déjà des objets de valeur pour lire ces informations depuis votre base de données? –

+0

@NickLarsen - Non. Mon intention est de fournir une méthode dans notre couche d'accès logique qui renvoie la chaîne XML. Je vais ensuite remplir un contrôle d'arborescence à l'aide de cette chaîne XML, pour permettre aux utilisateurs de sélectionner le rapport qu'ils souhaitent afficher. –

Répondre

2

L'astuce est ici que vous avez besoin de deux LINQ déclaration séparée, un LINQ to SQL pour lire les données, et un LINQ-à-xml pour l'écrire.

var reportdata = from r in db.MesReport 
//    where r.whatever ...... 
       select r; 

var reportXmlItems = from rx in reportData 
       select new XElement("MesReport", 
        new XElement("ReportTitle", rx.ReportTitle), 
        new XElement("ReportName", rx.ReportName 
        new XElement("DatabaseServer", rx.DatabaseServer 
        new XElement("Database", rx.Database 
        new XElement("Login", rx.Login 
        new XElement("MesReportId", rx.MesReportId 
        new XElement("ParentId", rx.ParentId) 
       ); 

var reportXml = new XElement("MesReports", reportXmlItems); 
+0

Je suppose que la réponse est non, mais ne serait-il pas possible de remplacer 'select r' par' select new XElement ... '? Est-ce que .NET permet de mélanger LINQ-to-SQL/Entities et LINQ-to-XML en une seule requête? –

+0

Nelson: À un certain point, vous devrez mettre '.AsEnumerable()' pour passer de LINQ-to-SQL à LINQ-to-XML. En d'autres termes, vous pouvez le faire: 'var items = à partir de rx in (à partir de r dans db.MesReport où ... sélectionnez r) .AsEnumerable() sélectionnez new XElement ...' – Gabe

+0

En fait, vous pourriez probablement le faire. Vous pouvez certainement fusionner les deux dernières lignes, et je suis sûr que vous pouvez faire tous les trois en un. Je les ai juste fait trois pour mieux montrer ce qui se passait. –

Questions connexes