Quand les enregistrements de tables connexes chargés de LINQ2SQL
-
21-08-2019 - |
Question
Disons que j'ai deux tables:
- Rapport
- Commentaire
Et en supposant que j'ai un contexte de base de données:
var reports = db.Reports();
Comment puis-je assurer que tous les commentaires pour chaque rapport sont chargés aussi bien?
A ce point, je veux déconnecter de la base de données, mais toujours avoir accès aux commentaires. (Par exemple:)
reports[0].Comments[0].Subject
La solution
Je suppose qu'il ya un 1-M FK relation entre les rapports et les commentaires (1 rapport peut avoir de nombreux commentaires)?
Une option consiste à utiliser le DataLoadOptions méthode de .LoadWith - quelque chose comme ce qui suit:
var reports = db.Reports();
DataLoadOptions dlo = new DataLoadOptions();
dlo.LoadWith<Reports>(r => r.Comments); // Ask for Comments along with reports
reports.LoadOptions = dlo;
Maintenant, chaque fois que vous sélectionnez un rapport sur ce contexte de données, les commentaires sera récupéré à partir du db avec elle.
méfiez-vous que tous les champs de commentaires seront sélectionnés -. Il n'y a aucun moyen d'utiliser cette méthode pour sélectionner un sous-ensemble des champs
Une autre option est d'être précis sur ce que vous voulez sélectionner dans la requête Linq, par exemple.
var myReportsList = from report in db.Reports
select new { // Using anonymous type, but could use a custom class
Report = report,
Comment = report.Comment.Detail, // for example
Subject = report.Comment.Subject
};
Pour comprendre lorsque la requête s'exécuter et la connexion de base de données fermée, vous devez comprendre:
- Le modèle d'exécution différée de LINQ et LINQ to Sql (En gros, pour LINQ to SQL, la requête ne fonctionne que lorsque les résultats sont demandés par exemple itérer sur la collection ou la liaison à un réseau)
- La différence entre IQueryable et IEnumerable
Jon Skeets « C # en profondeur » donne un aperçu de ces derniers, et je l'ai aussi entendu de très bonnes choses sur « Linq in Action » - plus il y a beaucoup de messages de blog au sujet de ces concepts qui font les sujets plus justice que Je peux le faire ici; o)
Autres conseils
Gardez à l'esprit que si vous utilisez LoadOptions pour définir un chemin multi-hop (rapports, commentaires, anotherentity), le 3ème et le houblon supplémentaires sont chargés (si elle est liée sur 1: n relations) par le code qui est très inefficace: ils « exécuter une requête ll par parent. Pour les rapports-commentaires, il est ok, ils seront récupérés en 2 requêtes.