7
votes

Utiliser DateTime dans Dynamic Linq vers des entités

J'utilise LINQ vers des entités pour récupérer des dates d'achat d'éléments comme suit: xxx pré>

La clé ici est que la colonne DB contient la date et l'heure de sorte que le temps doit être dépouillé pour le comparateur . Ce code fonctionne bien. P>

Maintenant, je veux faire la même chose en utilisant Dynamic Linq vers des entités. J'utilise dynamic.cs à partir du dossier d'échantillons de code VS2010. Lorsque je code: p> xxx pré>

ou une variante de même, je reçois un message d'erreur. Qu'est-ce que je dois coder comme valeur de chaîne pour faire ce travail? (Étant donné que je peux utiliser .startswith ou .Contains à l'intérieur de la chaîne, j'espère que la fonction de date de la date dynamique Linq reconnaîtra). P>

Je sais que je peux créer la requête Dynamic Linq d'être une plage de date, conceptuellement : P>

PurchaseDate >= myPurchaseDate@midnight and PurchaseDate <= myPurchaseDate+23:59:59


1 commentaires

Quelle version du cadre d'entité utilisez-vous?


4 Réponses :


0
votes

Je pense que vous allez vouloir aller avec la plage de date afin de pouvoir tirer parti de l'indexation sur le serveur si vous en avez besoin. Si vous baseez votre instruction SELECT sur un champ calculé, elle devra scanner la table pour chaque requête.


1 commentaires

Merci de confirmer mon hunch. Bien que je n'ai pas fait d'analyse de plan de requête, cela a du sens pour moi.



0
votes

Voici un lien qui répertorie les fonctions EF4 qui plantent vers SQL Fonctions

modèle conceptuel canonique sur les fonctions SQL Server Mapping


1 commentaires

Merci. J'ai vu cette liste. Cependant, il ne s'applique pas à des requêtes dynamiques de Linq aux entités. Franchement, je ne suis pas sûr que cela s'applique même à Linq vers des entités, car j'ai toujours dû utiliser la liste canonique des fonctionnalités entityfices (qui est différente).



2
votes

Si vos requêtes recherchent souvent à la date de l'aspect de la date, une autre approche à prendre en compte, si possible avec votre base de données SQL Server, seraient à stocker redondante une version tronquée de la colonne DateTime, dans un type de colonne de date. Voir http://msdn.microsoft.com/en-us/library/bb630352. ASPX ).

Toutes vos questions peuvent alors mieux fonctionner car il n'y a pas de conversions nécessaires, sont moins sujettes aux erreurs de développeur. Et ils sont plus faciles à interroger dans un vieil SQL clair aussi.

Vos requêtes EF interrogeraient ensuite sur la colonne SQL Server Date Colonne


1 commentaires

Nous commençons actuellement à concevoir la nouvelle base de données et c'est quelque chose que je prévois d'augmenter avec l'architecte de la base de données.



12
votes

J'ai récemment commencé à utiliser Dynamic Linq pour un projet et souhaipe également comparer les dates sans composant temporel. Le code d'exemple Dynamic Linq C # dynamique de Microsoft (dynamic.cs) prend en charge un ensemble de types fixe et entityfunctions n'est pas l'un d'entre eux.

Mais avec une petite expérimentation, j'ai constaté que juste ajouter EntityFunctions au tableau des types prédéfinis permet d'utiliser TRUNCATETIME et probablement autre entityfonctions méthodes également.

Voici quelle est la dynamique. CS PrefefinedTypes Array ressemble à mon projet: xxx

avec ce fichier dynamic.cs modifié, je suis capable de créer des requêtes dynamiques de Linq, y compris des expressions telles que l'exemple d'achat dans votre question .


2 commentaires

Excellente solution. Merci!


Solution très soignée convenue, très utile.