60 votes

Linq OrderByDescending, null en premier

J'ai un champ dans ma base de données qui contient un DateTime?. Je voudrais trier les résultats de sorte que les valeurs NULL apparaissent en haut, puis en descendant par DateTime, par exemple,

 null
null
2012-04-01
2012-01-01
2011-09-04
 

La raison en est que je regarde les dates d'expiration, bien que certaines entrées n'expirent pas.

157voto

Frédéric Hamidi Points 123646

Vous pouvez renvoyer DateTime.MaxValue au lieu de null partir de l'expression de commande. Ainsi, les lignes comportant des dates null sont triées en premier:

 yourData.OrderByDescending(row => row.dateTimeField ?? DateTime.MaxValue);
 

30voto

Zach Points 61

Je trouve que l'approche la plus simple est:

 data.OrderBy(Function(o) o.myDate IsNot Nothing).ThenByDescending(Function(o) o.myDate)
 

en C # je pense ...

 data.OrderBy(o => o.myDate != null).ThenByDescending(o => o.myDate)
 

Cela fonctionnera également avec LINQ to SQL. Je ne sais pas si if(nullable, value) traduira correctement en SQL.

2voto

Jon Points 6911

Vous pouvez essayer quelque chose comme ça:

 var nulls = table.Where(x => x.NullableDateTimeField == null);
var notNulls = table.Where(x => x.NullableDateTimeField != null);

var result = nulls.Concat(notNulls.OrderByDescending(x => x.NullableDateTimeField));
 

C'est plus "évidemment correct" que "susceptible d'être super efficace", mais c'est au moins un point de départ.

0voto

andrew Points 1

jetez un oeil ici: http://www.davidoesterreich.com/blog/linq-sort-by-nulls-last/ :

 var queryResult =
orderedProducts from enumerableProducts
order by orderedProducts.ProductName,
orderedProducts.Price != null ? 1 : 0 descending,
orderedProducts.Price
select orderedProducts;
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X