48 votes

Date' n'est pas supporté dans LINQ to Entities. Seuls les initialisateurs, les membres de l'entité et les propriétés de navigation de l'entité sont supportés.

J'essaie d'exécuter le code suivant et je reçois une erreur

public List<Log> GetLoggingData(DateTime LogDate, string title)
{
     var context = new LoggingEntities();
     var query = from t in context.Logs

           where t.Title == title 
           && t.Timestamp == LogDate

           select t;
     return query.ToList();
}

L'erreur que je reçois est la suivante : "Le membre de type spécifié 'Date' n'est pas pris en charge par LINQ to Entities. Seuls les initialisateurs, les membres de l'entité et les propriétés de navigation de l'entité sont pris en charge." J'ai essayé plusieurs fois de transformer tout en chaîne de caractères, en comparant uniquement la partie date, mais je n'arrive pas à trouver la bonne combinaison. Toute aide est la bienvenue.

88voto

Henrik Stenbæk Points 1092

Si vous utilisez EF 6.0+, vous pouvez utiliser DbFunctions.TruncateTime(DateTime?) :

var query =
    from t in context.Logs
    where t.Title == title 
    && DbFunctions.TruncateTime(t.Timestamp) == LogDate.Date
    select t;

Note : Pour les versions antérieures de EF où DbFunctions n'est pas disponible, EntityFunctions.TruncateTime(DateTime?) peut être utilisé à la place.

24voto

mikemurf22 Points 817

Ce n'est pas la meilleure solution, mais elle fonctionne. Pour diverses raisons, je dois utiliser .net 3.5 à ce stade et modifier la base de données serait difficile. Quoi qu'il en soit, voici une solution qui fonctionne :

            var query = from t in context.Logs
                      where t.Title == title 
                      && t.Timestamp.Day == LogDate.Day
                      && t.Timestamp.Month == LogDate.Month
                      && t.Timestamp.Year == LogDate.Year
                      select t;

Ce n'est pas la solution la plus élégante, mais elle est efficace.

2voto

Babul Mirdha Points 769

Utilisez toujours EntityFunctions.TruncateTime() pour x.DateTimeStart et LogDate. comme par exemple :

var query = from t in context.Logs
              where t.Title == title 
              && EntityFunctions.TruncateTime(t.Timestamp) == EntityFunctions.TruncateTime(LogDate)
              select t;

1voto

Mike Points 517

Corrigez-moi si je me trompe, mais dans l'exemple de mikemurf22, il faudrait vérifier chaque partie du composant date, et potentiellement beaucoup plus de traitement serveur ?

Bref, je suis tombé sur ce problème, et voici ma solution.

En supposant que vous allez transmettre uniquement le composant de date, vous pouvez trouver la dernière minute du jour que vous transmettez, et utiliser la clause where pour définir la plage.

public List<Log> GetLoggingData(DateTime LogDate, string title)
{
    DateTime enddate = new DateTime(LogDate.Year, LogDate.Month, LogDate.Day, 23, 59, 59)

    var query = from t in context.Logs
                where t.Timestamp >= date
                where t.Timestamp <= enddate
                select t;

    return query.ToList();
}

-1voto

algreat Points 2494

Vous pouvez utiliser ce hack :

DateTime startDate = LogDate.Date;
DateTime endDate = LogDate.Date.AddDays(1);

var query = from t in context.Logs
            where t.Title == title 
                  && t.Timestamp >= startDate 
                  && t.Timestamp < endDate
            select t;

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