web-dev-qa-db-fra.com

La date n'est pas prise en charge dans LINQ to Entities. Seuls les initialiseurs, les membres d'entité et les propriétés de navigation d'entité sont pris en charge.

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 "Le type de membre spécifié" Date "n'est pas pris en charge dans LINQ to Entities. Seuls les initialiseurs, les membres d'entité et les propriétés de navigation d'entité sont pris en charge." J'ai essayé diverses tentatives pour transformer chaque chaîne en chaîne, en comparant seulement la partie de date, mais je n'arrive pas à obtenir la bonne combinaison. Toute aide est grandement appréciée.

47
mikemurf22

Pas la meilleure solution, mais ça marche. 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 c’est efficace.

24
mikemurf22

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;

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

86
Henrik Stenbæk
3
Rahul Nikate

Utilisez toujours EntityFunctions.TruncateTime () pour x.DateTimeStart et LogDate ..__, tels que:

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

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

Quoi qu'il en soit, je suis tombé sur ce problème et c'est ma solution.

En supposant que vous ne transmettiez que 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();
}
1
Mike

Convertissez LongDate en .ToShortDateStringet utilisez-le de cette façon: 

EntityFunctions.TruncateTime(t.Timestamp) == LogDate

comme Mike l'a fait

0
sansalk

Essaye ça:

var calDate = DateTime.Now.Date.AddDays(-90);

var result = return (from r in xyz where DbFunctions.TruncateTime(r.savedDate) >= DbFunctions.TruncateTime(calDate)
0
user3783446