2010-04-16 5 views
3

Ma question est de savoir comment trier une requête Linq par une table sous:Linq Trier par une sous-table

Tableau Applications:

- app_id 
- name 

Tableau AppStatus:

- app_status_id 
- app_id 
- severity 
- status_date 

Je voudrais avoir une requête avec toutes les applications, triées par le dernier degré de gravité:

app_id name 
1 first 
2 second 
3 third 

app_status_id app_id severity status_date 
1 1 5 12-4-2010 
2 1 2 15-4-2010 
3 2 7 10-4-2010 
4 3 3 13-4-2010 

Now i want it sorted like: 
app_id name 
3 third 
1 first 
2 second 

Quelqu'un peut-il m'aider avec une requête LINQ pour cela.

J'ai essayé ce qui suit déjà, mais cela ne fonctionne pas:

var apps = from apps in dc.Apps 
         orderby apps.AppStatus.LastOrDefault().severity 
         select apps; 

Edit:

Je vais affiner ma question, il faut d'abord obtenir toutes les applications avec le dernier état (si par date du statut), il devrait alors ordonner cette liste en fonction de la gravité de ce dernier statut.

+0

Dans votre exemple, ne serait pas les applications, triées par le dernier statut La ressemblance ressemble-t-elle à la première, à la troisième, à la seconde? – Jens

Répondre

2

Essayez ceci:

var apps = from apps in dc.Apps 
      orderby apps.AppStatus.Max(a => a.severity) 
      select apps; 

Modifié en fonction de votre commentaire:

var apps = from apps in dc.Apps 
      where apps.AppStatus.Count() > 0 // to prevent null reference below 
      orderby apps.AppStatus.Where(a1 => a1.status_date == 
       apps.AppStatus.Max(a2 => a2.status_date) 
      ).Single().severity 
      select apps; 
+0

Merci, mais il n'a pas encore tout résolu, il a besoin du dernier AppStatus de chaque application, puis le trier selon la gravité de chaque dernier statut. – Michael

+0

Essayez la nouvelle version sur pour la taille. –

+0

Je pense que cela l'a corrigé, j'ai enlevé la partie où app.AppStatusCount()> 0, parce que je veux montrer l'application même si elle n'a eu aucun statut. Merci! – Michael

1

Essayez de rejoindre le tri puis:

var apps = from a in dc.Apps 
      join s in dc.AppStatus on a.app_id == s.app_id 
      orderby s.severity 
      select a; 
0
from app in myDC.Apps 
let severity = 
(
    from status in app.AppStatus 
    orderby status.StatusDate descending 
    select status.Severity 
).First() 
order by severity 
select app