2010-08-04 5 views
2

J'ai une méthode qui contient les éléments suivants Linq au code SQL:Lancer un type anonyme à un type connu

public List<L2SBusinessEntities.Report.MesReport> GetListForReportTree(MESProductionDatabase database) 
    { 
    byte[] byteArray = new byte[1]; 
    var results = 
     from report in database.MesReport 
     select new { report.MesReportID, 
      report.ParentID, 
      report.ReportTitle, 
      report.ReportName, 
      report.DatabaseServer, 
      report.DatabaseName, 
      report.Login, 
      ReportFile = byteArray }; 

    return (List<L2SBusinessEntities.Report.MesReport>)results; 
    } 

Je reçois un incapable de lancer une erreur en essayant de lancer des « résultats » du type montré dans la déclaration de retour. Dois-je être capable de faire cela? Une entité L2SBusinessEntities.Report.MesReport se présente comme suit:

int MesReportID 
int ParentID 
string ReportTitle 
string ReportName 
string DatabaseServer 
string DatabaseName 
string Login 
byte[] ReportFile 
+1

Ceci est très faux. – SLaks

Répondre

4

Votre méthode n'a pas besoin de coulée. Vous pouvez utiliser le code suivant pour revenir Liste de vos objets:

public List<L2SBusinessEntities.Report.MesReport> GetListForReportTree(MESProductionDatabase database) 
     { 
     byte[] byteArray = new byte[1]; 
     var results = (
      from report in database.MesReport 
      select new L2SBusinessEntities.Report.MesReport { 
       MesReportID = report.MesReportID, 
       ParentID = report.ParentID, 
       ReportTitle = report.ReportTitle, 
       ReportName = report.ReportName, 
       DatabaseServer = report.DatabaseServer, 
       DatabaseName = report.DatabaseName, 
       Login = report.Login, 
       ReportFile = byteArray }).ToList(); 

     return results; 
     } 

mise à jour -------------

une autre option pour votre requête:

public List<L2SBusinessEntities.Report.MesReport> GetListForReportTree(MESProductionDatabase database) 
     { 
     byte[] byteArray = new byte[1]; 
     var results = (
      from report in database.MesReport 
      select new { 
       MesReportID = report.MesReportID, 
       ParentID = report.ParentID, 
       ReportTitle = report.ReportTitle, 
       ReportName = report.ReportName, 
       DatabaseServer = report.DatabaseServer, 
       DatabaseName = report.DatabaseName, 
       Login = report.Login, 
       ReportFile = byteArray }) 
     .AsEnumerable() 
     .Select(c => new L2SBusinessEntities.Report.MesReport{ 
       MesReportID = c.MesReportID, 
       ParentID = c.ParentID, 
       ReportTitle = c.ReportTitle, 
       ReportName = c.ReportName, 
       DatabaseServer = c.DatabaseServer, 
       DatabaseName = c.DatabaseName, 
       Login = c.Login, 
       ReportFile = c.ReportFile }).ToList(); 

     return results; 
     } 
+0

Merci, mais cela ne fonctionne pas. Il se compile bien, mais quand je l'exécute, j'obtiens une erreur disant: "La construction explicite du type d'entité L2SBusinessEntities.Report.MesReport dans la requête n'est pas autorisée". –

+0

Essayez mon exemple mis à jour, s'il vous plaît. Il semble que L2SBusinessEntities.Report.MesReport est une classe d'entité. Vous pouvez les récupérer en utilisant des requêtes, mais vous ne pouvez pas créer d'entités dans le cadre d'une requête. –

+1

Je viens de penser, est votre base de données.MesReport contient L2SBusinessEntities.Report.MesReport Entites? dans ce cas, vous pouvez simplement écrire: var results = (à partir de report dans database.MesReport select report) .ToList(); –

0

changer votre code à quelque chose comme:

....your code through "from report in database.MesReport" here 
select new L2SBusinessEntities.Report.MesReport() { 
    report.ParentID, 
    report.ReportTitle, 
    report.ReportName, 
    report.DatabaseServer, 
    report.DatabaseName, 
    report.Login, 
    ReportFile = byteArray 
}; 

Si vous envelopper tout cela dans parens, vous pouvez même appeler .ToList() sur la requête LINQ elle-même, vous n'avez donc pas besoin de la lancer lorsque vous la renvoyez.

1

Oui, vous ne pouvez pas lancer comme ça. Vous pouvez ajouter un constructeur à votre classe MesReport qui a des paramètres dans le même ordre que celui que vous avez listé pour cela:

var results = 
     from report in database.MesReport 
     select new L2SBusinessEntities.Report.MesReport(report.MesReportID, 
      report.ParentID, 
      report.ReportTitle, 
      report.ReportName, 
      report.DatabaseServer, 
      report.DatabaseName, 
      report.Login, 
      ReportFile = byteArray); 
Questions connexes