'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'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 membre de type 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 de lancer everythign sur une chaîne, en comparant seulement la partie date, mais je n'arrive pas à obtenir la bonne combinaison. Toute aide est grandement appréciée.

48
demandé sur Rahul Nikate 2011-08-16 23:29:52

8 réponses

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.

85
répondu Henrik Stenbæk 2016-11-15 21:40:24

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;

Pas la solution la plus élégante, mais elle est efficace.

24
répondu mikemurf22 2011-08-16 20:05:37
3
répondu Rahul Nikate 2015-10-26 07:12:39

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
répondu Babul Mirdha 2013-06-13 17:34:53

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 du serveur?

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

En supposant que vous ne passerez que le composant date, vous pouvez trouver la dernière minute du jour où vous passerez 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
répondu Mike 2012-12-20 16:47:38

Convertissez LongDate en .ToShortDateString et vous pouvez l'utiliser de cette façon:

EntityFunctions.TruncateTime(t.Timestamp) == LogDate

Comme mike l'a fait

0
répondu sansalk 2015-09-16 11:45:41

Essayez ceci:

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

var result = return (from r in xyz where DbFunctions.TruncateTime(r.savedDate) >= DbFunctions.TruncateTime(calDate)
0
répondu user3783446 2017-01-24 20:15:29

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;
-1
répondu algreat 2014-03-26 14:32:25