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
Était-ce utile?

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.

scroll top