2010-12-05 23 views
3

J'ai une colonne timestamp dans SQL Server 2008.Comment faire pour interroger un horodatage dans SQL Server 2008 avec Linq-to-Entities?

Maintenant, j'ai besoin d'interroger cette colonne en utilisant une date qui provient d'un contrôle de serveur de calendrier.

Nous supposons que j'ai un objet DateTime dt;

J'ai besoin de filtrer par cet objet datetime qui retourne tous les enregistrements enregistrés à cette date (dt).

var a = DateTime.Now.ToString(); 
    var IsDone = from d in _le.diets 
       where d.log_time.Contains(a) 
       select d.done; 

_le est un objet de structure d'entité privée.

Ce code a un problème:

Erreur 3 'octet []' ne contient pas de définition pour 'Contient' et la meilleure surcharge de la méthode d'extension « System.Linq.ParallelEnumerable.Contains (système .Linq.ParallelQuery, TSource) » a un certain inopérants les arguments f: \ Tests \ alimentation alimentation \ \ DataTier \ DietMovieRepository.cs 30 32 alimentation

erreur 2 Impossible de convertir lambda expression de type 'string' parce qu'il est pas un type délégué f: \ Tests \ alimentation alimentation \ \ DataTier \ DietMovieRepository.cs 30 26 alimentation

Erreur 1 délégué 'System.Func' ne prend pas 1 arguments f: \ Tests \ alimentation \ alimentation \ DataTier \ DietMovieRepository.cs 30 26 régime

erreur 4 argument instance: ne peut pas convertir les 'byte []' à 'System.Linq.ParallelQuery' f: \ Tests \ alimentation régime \ \ DataTier \ DietMovieRepository .cs 30 32 régime

Je suis un débutant EF, tha nks pour votre aide!

MISE À JOUR

IN EF fichier cs

Je vois

public static diet Creatediet(global::System.Int64 id, global::System.Boolean done, global::System.Byte[] log_time) 
     { 
      diet diet = new diet(); 
      diet.id = id; 
      diet.done = done; 
      diet.log_time = log_time; 
      return diet; 
     } 

Répondre

3

A « timestamp » SQL Server n'a rien à voir avec le temps (en fait est maintenant marqué désapprouvée le nom « horodatage »; « rowversion » est identique et devrait être utilisé à la place).

Si vous avez vraiment un "horodatage" cela n'est pas possible. Si vous avez un ensemble datetime au temps d'insertion, il devrait être trivial:

DateTime start = date.Date, end = start.AddDays(1); 

... 
where row.log_time >= start && row.log_time < end 
... 

De plus, si vous faites des recherches principalement la date de gamme, log_time peut être candidat juste pour l'index cluster. Ou si vous faites des requêtes basées sur un jour, un index non clusterisé sur un entier qui est le days-into-epoch fonctionnerait aussi.

+0

2016 maintenant et EntityFramework utilise toujours l'horodatage lorsque vous générez une table avec une version de ligne –

0

En supposant que vous voulez regarder seulement la partie de la date de celui-ci? Ensuite, vous devriez être en mesure de faire quelque chose comme:

var a = DateTime.Now; 
    var isDone = from d in _le.diets 
       where d.log_time.Date == a.Date 
       select d.done; 
+0

Merci pour la réponse, mais il semble que je ne peux pas obtenir d.log_time.Date. Parce que log_time est un horodatage dans la base de données. – user469652

+0

Oh ok, quel est le type de log_time? Est-ce un TimeSpan? – Phill

+0

C'est un horodatage, j'ai mis à jour cela. – user469652