2009-02-04 6 views
2

Je vais avoir du plaisir avec celui-ci. Peut-être le manque de sommeil ... ou peut-être que je deviens stupide.Linq-to-sql Un-à-plusieurs avec un maximum

J'ai 2 tables:
a) {personne clé, nom, lastname}
b) logentry {Key, PersonKey, identifiez-vous, entryTime}

J'essaie d'obtenir une jointure de la personne et LogEntry où LogEntry est le dernier LogEntry pour la personne donnée.

J'espère que je ne vais pas "duh ..." dans cinq minutes lorsque les réponses me frappe fort.

Répondre

2

Si vous avez des relations avec SQLServer vous devriez avoir dans la personne de classe quelque chose comme Person.LogEntries. Vous pouvez faire comme ceci:

LogEntry logEntry = 
Person.LogEntries.OrderByDescending(p => p.EntryTime).FirstOrDefault(); 

Ensuite, vous pouvez vérifier si logEntry est nul sinon je devrais avoir la dernière entrée du journal pour la personne.

+0

Mon cerveau a été bloqué en essayant d'utiliser Max. Merci! – Daniel

+0

Vous êtes les bienvenus. –

0

Sur une classe partielle pour personne, créer une nouvelle propriété semblable à ceci:

public partial Person 
{ 
    public LogEntry RecentLogEntry 
    { 
     get 
     { 
      return LogEntries.OrderByDescending(l => l.EntryTime).FirstOrDefault(); 
     } 
    } 
} 

Je crois que ce (ou quelque chose de similaire) devrait fonctionner, bien que ce soit de la mémoire. Ceci, bien sûr, repose sur la présence de vos relations.

Si vous préférez le faire lors de la sélection de vos dossiers, vous pouvez essayer ceci:

var people = from p in context.People 
      select new 
      { 
       Person = p, 
       LatestLogEntry = p.LogEntries.OrderByDescending(l => l.EntryTime).FirstOrDefault() 
      }; 
1

Si l'on n'a pas la configuration des relations, la réponse acceptée peut être fait par:

var r = Person 
    .GroupJoin(
     LogEntry, 
     o => o.Key, 
     i => i.PersonKey, 
     (o,i) => new {o, Entry = i.OrderByDescending(x => x.EntryTime).First()});