Eifrig Lade- / Vorabsteuerung viel zu viel ohne Last-linq zu SQL
-
20-09-2019 - |
Frage
Ich habe eine Situation, in der ich einige Entitäten durch eine viele zu viele Beziehung vorlegen muss. Es ist also wie der Klassiker BlogPost <- BlogPostTag -> Tag
Lage.
Ja, ich bin mir der Loadoptionen bewusst, kann sie aber nicht verwenden, da es sich um eine Webanwendung handelt und ich den einen DataContext pro Anforderungsmuster verwende.
Es scheint auch, dass Sie keine Projektion verwenden können, um viele zu viele Beziehungen vorzubereiten. Ja? Nein?
Ich möchte zurückkehren IQueryable<Tag>
Basierend auf einer Reihe von Blogs. Das Beste, was ich tun kann, ist, es zurückzukehren IQueryable<IEnumerable<Tag>>
durch Folgendes:
public IQueryable<Tag> GetJobsCategories(IQueryable<BlogPost> blogPosts)
{
var jobCats = from bp in blogPosts
select bp.BlogPostTags.Select(x => x.Tag);
return jobCats;
}
Kann ich das verflachten? Vermisse ich etwas Offensichtliches? Gibt es einen anderen Ansatz, den ich ergreifen kann?
Und nein, ich kann nicht orms ändern ;-)
Lösung
Dies wird funktionieren, Sie können einfach in der Linq -Abfrage einbohren
public IQueryable<Tag> GetJobsCategories(IQueryable<BlogPost> blogPosts)
{
return from bp in blogPosts
from tag in bp.BlogPostTags
select tag;
}
Wenn Sie die Methode als solche deklarieren:
public static IQueryable<Tag> GetJobsCategories(this IQueryable<BlogPost> blogPosts)
Sie können es als Erweiterungsmethode für Abfragen verwenden. Zum Beispiel
myContext.BlogPosts.GetJobsCategories()