2009-10-20 4 views
1

Hey, j'essaie de créer un Expression<Func<T, bool>> dans lequel une propriété de chaîne est convertie/cast en un DateTimeOffset afin que les opérations DateTimeOffset peuvent être effectuées sur elle. Nous utilisons Linq2SQL comme fournisseur de données, qui prend en charge la conversion de chaînes en l'équivalent SQL de DateTimeOffset. Idéalement, je veux que l'expression soit évaluée directement dans la source de données IQueryable, et non en mémoire comme IEnumerable.Parse chaîne comme DateTimeOffset dans Expression <Func <T, bool>>

Voir ci-dessous un exemple de ce que j'ai essayé de loin:

public class MyClass 
{ 
    public string MyValue; 
} 

Expression<Func<MyClass, bool>> filter = mc => DateTimeOffset.Parse(mc.MyValue) > new DateTimeOffset(2007,1,1); 

Malheureusement, cette définition provoque filtre une dans l'évaluation de la mémoire.

+0

Je suis confus. La colonne de la table physique est-elle un "char" ou un "datetime"? –

+0

En SQL, la colonne est une chaîne (nvarchar je crois) – NoizWaves

Répondre

1

Puisque la colonne de la table physique sous-jacente est nvarchar et non datetime, je pense que vous n'avez pas de chance. Le fournisseur LINQ2SQL sait qu'il s'agit de données nvarchar et par conséquent ne générera pas d'expressions SQL natives qui traitent cette valeur comme datetime.

Pour être honnête, je ne peux même pas voir un moyen sûr de le faire avec SqlCommand objets bruts fabriqués à la main. Vous devriez vraiment lire les données dans la mémoire comme String, puis le convertir en DateTimeOffset, puis le filtrer manuellement en mémoire. Si vous souhaitez un filtrage SQL natif sur cette colonne, vous devez modifier le schéma de la table.

Questions connexes