2010-10-01 2 views
1

J'ai une relation parent/table enfant avec la table enfant reliée à ParentTable via la clé étrangère ParentId. Il y a plusieurs enregistrements dans ChildTable pour chaque enregistrement ParentTable. Pour ceux d'usage vous aimez les visuels rudimentaires, voici le schéma.Utilisation de Linq2SQL pour renvoyer des données de table parent, mais triées par données de table enfant

ParentTable 
------------ 
+Id 
Date 

ChildTable 
------------ 
+Id 
ParentId 
Date 

Ce que je suis en train de faire est de revenir seul enregistrement pour chaque élément ParentTable qui est jointe à la valeur de la date de la dernière ChildTable (Note, pas de valeur Date du parent). Les résultats devraient ressembler à:

ParentTable::Id ParentTable::Foo ChildTable:Id ChildData::Foo ChildData::Date 
--------------- ---------------- ------------- -------------- --------------- 
55    Other Values  700   Other values 12/1/2010  
1    "    1000   "    11/30/2010 
10    "    214   "    10/31/2010 

Il est important que le ChildData :: Date soit trié par ordre décroissant.

Cela semble être simple, mais je suis aux prises avec les aspects LinQ2SQL. J'attends toujours mon moment "ah-ha" quand je peux penser à Linq.

est ici la réponse finale, grâce à Winston:

var results = 
    from p in parent 
    join c in (from c2 in child orderby c2.Date descending select c2) 
    on p.Id equals c.ParentId into childGroup 
    select new { ParentId=p.Id, ParentDate=p.Date, ChildDate=childGroup.First().Date } into NewResult 
    orderby NewResult.Activity descending 
    select NewResult 

Répondre

1

Ce qui suit devrait fonctionner, je l'ai testé sur des données fictives.

var results = 
    from p in parent 
    join c in (from c2 in child orderby c2.Date descending select c2) 
    on p.Id equals c.ParentId into childGroup 
    select new { ParentId=p.Id, ParentDate=p.Date, ChildDate=childGroup.First().Date }; 

Mis à jour pour sélectionner uniquement les champs requis.

+0

Ahhh ... remercie Winston pour l'édition. Je me préparais juste à poser quelques questions. – taudep

+0

Je pense que je l'ai fonctionné. Il semble que l'on fasse un choix pour chaque ROW dans les résultats. Je me demande s'il existe un moyen d'optimiser cela? Je pourrais renvoyer plus de 100 lignes de ces données. – taudep

+0

En fait, ça ne marche pas vraiment. Si la table enfant a deux éléments pour un PARENT donné, elle retourne les deux. Où se passe l'unicité? – taudep

0

Essayez quelque chose comme

var x = ParentTable.Select(z=> new { 
z.Id, 
z.Foo, 
z.ParentIDChildTable.OrderBy(c=> c.Date).First().ID, 
z.ParentIDChildTable.OrderBy(c=> c.Date).First().Foo, 
z.ParentIDChildTable.OrderBy(c=> c.Date).First().Date 

} 

Il est peut-être une meilleure façon de commander la table des enfants avant de choisir, mais je ne peux pas penser ... aussi la clé étrangère ne peut pas être dactylographiées comme ci-dessus, mais IntelliSense devrait vous aider là-bas.

+0

Pour cela, doit ParentIdChildtable être cet objet enfant, une référence plus comme z.Child.First(). ParendId?(Je ne comprends pas le contexte de ParendIDChildTable) – taudep

+0

La syntaxe suppose que vous avez une configuration de relation de clé étrangère dans SQL. Vous pouvez ensuite accéder directement à cette table relationnelle. ParentIDChildTable est représentatif de cette relation de clé étrangère. –

+0

J'aime voir cette approche alternative. Merci. L'une des choses avec lesquelles je continue de lutter dans Linq2Sql est la MULTIPLE façons de faire la même chose. Chacun développe son propre "style" pour ainsi dire. Merci. – taudep

Questions connexes