2017-10-19 14 views
0

J'essaie de créer un sitemap XML dynamique pour mon application Web ASP.NET MVC. Les pages sont structurées et prévisibles sur la base des données extraites de la base de données par un modèle de cadre d'entité 6. Je voudrais simplement utiliser des littéraux XML pour récupérer chaque élément de la base de données, un peu comme ce qui se passe here.Linq aux entités à l'intérieur de XML Literal produit «Seuls les constructeurs sans paramètres sont pris en charge dans Linq aux entités»

Ma déclaration se présente comme suit:

Dim xmlSitemap = <?xml version="1.0" encoding="UTF-8"?> 
       <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> 
        <url> 
         <loc>https://example.com</loc> 
        </url> 
        <url> 
         <loc>https://example.com/Home/Contact</loc> 
        </url> 
        <%= From blog in db.Blogs Select <url> 
                  <loc>https://example.com/BlogPosts/<%= blog.PostId %></loc> 
                 </url> %> 
       </urlset> 

L'exécution de cette résultats de code dans System.NotSupportedException: 'Seuls les constructeurs et initialiseurs sont sans paramètre pris en charge dans LINQ to Entities'.

Modifier le modèle pour inclure un Public Sub New() sans arguments ne corrige pas cette erreur. Basé sur mes recherches après avoir essayé cela, je suppose que cela a à voir avec le fait que je concatène des chaînes dans la requête Linq, mais je ne sais pas d'une autre façon. Existe-t-il un moyen de créer le sitemap de cette façon, ou est-ce que je demande trop?

+0

Je suppose qu'au niveau .NET, l'expression compilée générée par cette balise '' est trop complexe pour être gérée dans Entity Framework (c'est-à-dire dans une instruction SQL). Essayez d'ajouter '.ToList()' ou '.AsEnumerable()' après 'db.Blogs' pour forcer le reste de votre instruction LINQ dans un contexte LINQ-to-Objects. – StriplingWarrior

+1

@StriplingWarrior, en ajoutant '.ToList()' a effectivement fonctionné. Je n'avais pas pensé à ça. Pourriez-vous faire votre commentaire dans une réponse complète, afin que je puisse le marquer correctement? –

Répondre

1

Je suppose qu'au niveau .NET, l'expression compilée générée par cette balise est trop complexe pour être gérée dans Entity Framework (c'est-à-dire dans une instruction SQL). Essayez d'ajouter .ToList() ou .AsEnumerable() après db.Blogs pour forcer le reste de votre instruction LINQ dans un contexte LINQ-to-Objects.

Remarque: vous devez vous assurer que vous comprenez ce que cela fait, et évitez de faire .ToList() avant une clause Where, par exemple, afin d'éviter de graves pénalités de performance.