2009-10-10 7 views
0

Je vais avoir besoin de votre aide sur celui-ci.LINQ to SQL lambda exp. OrderBy, Case When

J'essaye de OrderBy première réponse datetime si présent. S'il est vide/nul, il doit classer par sujet datetime. J'ai fini avec l'expression suivante, mais il ne semble pas fonctionner :(

return db.Topics 
.Where(t => t.ForumID == id) 
.OrderBy(
    t => t.Replies 
    .OrderBy(r => r.AddDatetime.Equals(System.Data.SqlTypes.SqlDateTime.Null.Value) ? t.AddDatetime : r.AddDatetime) 
    .Select(r => r.AddDatetime) 
    .First() 
); 

Répondre

1

Si vous pouvez vivre avec retourner un objet POCO vous pouvez faire:

var pocoenum = db.Topics 
.Where(t => t.ForumID == id) 
.Select(
new { 
    ... 
    AddDatetime = t.Replies.Select(r => r.AddDateTime).FirstOrDefault == null ? t.AddDatetime : t.Replies.Max(r => r.AddDateTime) 
}; 

return pocoenum.OrderBy(p => p.AddDatetime) 

SQL ne sera pas le plus beau cependant.

0

Vous aurez besoin de deux déclarations Linq, un pour chaque OrderBy. Utilisez une instruction If de décider quelle déclaration LINQ to retour.

le problème avec votre code existant est que le lambda attend une référence à un champ, mais le résultat de l'opération ternaire est une valeur.

1

pourquoi cant vous venez

db.Topics retour .Lorsque (t => t.ForumID == id) .OrderBy (t.Replies.Min (r => (DateTime?) R. AddDateTime) ?? t.AddDateTime) .Choisir (r => r.AddDatetime) .Premier()

si r.AddDatetime lui-même est annulable, vous pouvez alors enlever le plâtre, sinon vous devez cAST pour faire certaine que la fonction Min renvoie DateTime? et non DateTime