2011-03-13 4 views
3

Dans la requête ci-dessous, comment supprimer une partie de la colonne datetime pour obtenir uniquement les dates distinctes?linq query date distincte

using (var ctx = new DBConn()) 
{ 
    var q = ctx.Table.Select(r => r.datetimefield).Distinct(); 
} 
+0

Cette question a la bonne réponse, vous voulez utiliser EntityFunctions.TruncateTime http://stackoverflow.com/questions/11524853/distinct-date-with-linq –

Répondre

10

Vous trébuchant sur un défaut avec LINQ to SQL ou EF (je ne sais pas celui que vous utilisez). La solution directe consisterait à utiliser la propriété DateTime.Date. Toutefois, elle n'est pas prise en charge dans les deux ORM, elle ne correspond pas à une méthode SQL.

Vous avez deux solutions:

  1. évaluation stricte de la requête en utilisant ToList:

    var q = ctx.Table.ToList().Select(r => r.datetimefield.Date).Distinct(); 
    
  2. créer un champ détaillant uniquement le composant de date dans la base de données. C'est la façon dont je vais habituellement, car vous pouvez rester dans la base de données et y exécuter la requête.

+0

cela fonctionne en ajoutant r.datetimefield.Value.Date – user285677

+0

ouais, vous avez besoin de 'Value' si' datetimefield' est un 'Nullable '. Sachez cependant que cela va pousser la requête en mémoire, ce qui peut prendre beaucoup de temps pour des requêtes étendues. Vous devriez jeter un coup d'oeil dans le point deux, cela vous sauvera beaucoup de maux de tête à long terme. – Femaref

+0

En fait, il existe un moyen de le faire, voir cette réponse: http://stackoverflow.com/a/11525054/68818 –

3

En supposant r.datetimefield est un DateTime, vous pouvez utiliser DateTime.Date pour supprimer le composant de temps:

var q = ctx.Table.Select(r => r.datetimefield.Date).Distinct(); 
+0

Vous ne pouvez pas, du moins pas avec linq-to-sql ou EF comme la propriété 'Date' ne correspond pas à une méthode SQL. – Femaref

+0

La propriété date est disponible via value.date mais j'obtiens l'erreur "Le membre de type spécifié 'Date' n'est pas pris en charge dans LINQ to Entities" – user285677

+0

oui, c'est ce que je fais allusion à. Vous ne pouvez pas utiliser la propriété 'Date' dans une requête car EF ne l'applique pas à une méthode SQL. Ce que je vois personnellement comme une faute massive. – Femaref