2010-08-17 5 views
0

Cette question est similaire à celui-ci:Obtenir les lignes d'une table et dernière 1 ligne d'une table associée, dans LINQ

LINQ to SQL: GroupBy() and Max() to get the object with latest date

Mais j'ai une table que je veux revenir un grand nombre de lignes de. Sa clé primaire est utilisée comme clé étrangère dans une seconde table. Pour chaque ligne renvoyée à partir de la première ligne, je souhaite également renvoyer (dans le même jeu de résultats) la dernière ligne (dans ce cas, ordonnée par un champ datetime) 1 ligne.

Comment cela serait-il construit dans LINQ en utilisant C#?

Le meilleur que j'ai est:

var instances = from i in ContextDB.Instances 
        join p in ContextDB.Points on i.InstanceID equals p.InstanceID 
        where categoryIDs.Contains(j.CategoryID) 
        group p by p.InstanceID into latestPoint 
        select new latestPoint.OrderBy(i => i.Instance.Title).FirstOrDefault(); 

Mais ce qui est manifestement faux. Bien que je pense que je comprends correctement group je ne pense pas que je comprends correctement into.

[EDIT] Pour éviter toute confusion, je pense que cette question peut être résumée comme "Comment faire des lignes d'une table avec la dernière rangée 1 pour chacun d'une autre table?"

+0

Vous devez effacer votre montage .. je pense qu'il y a une faute de frappe. – Nix

+1

Il existe de meilleurs moyens de le faire, et cela commencerait par avoir des associations/relations dans votre modèle d'entité. Existe-t-il des associations entre Instances/CategoryInstances/Points dans votre modèle? – Nix

+0

Oui, CategoryInstances -> Instances sur InstanceID (dans les deux cas), Instances -> Point sur InstanceID (dans les deux cas). Il existe des références de table dans le schéma. Je vais supprimer la ligne impliquant CategoryInstances de l'échantillon car cela entraînerait une confusion. –

Répondre

1

Que diriez-vous:

var instances = from i in ContextDB.Instances 
       where i.CategoryInstances.Any(categoryIDs.Contains(ci => ci.CategoryID)) 
       select new 
       { 
        Instance = i, 
        LatestPoint = i.Points.OrderBy(i => i.Instance.Title).FirstOrDefault() 
       }; 

Notez que je peux retirer beaucoup de redondance par using associations instead of join.

+0

Parfois j'avais des suggestions en sachant qu'ils devraient le faire d'une meilleure façon ... mais c'est une hypothèse valide en supposant un lien entre Instance et points. – Nix

Questions connexes