2009-03-03 7 views
1

Est-ce que quelqu'un connaît l'équivalent de ISDATE() dans la syntaxe de requête LINQ to SQL? J'ai un champ varchar en SQL qui contient des dates et j'ai besoin de filtrer les lignes non-date.LINQ to SQL Équivalent de ISDATE() dans T-SQL et de casting?

espérait quelque chose comme ceci:

var query = SomeDataContext; 
    query = from p in query 
    where p.ISDATE(field1) == true; 
    select p; 

aussi, comment pourrait-on jeter quelque chose pour SQL dans la syntaxe LINQ?

CAST(SomeDate AS SMALLDATETIME) 

Répondre

3

L'astuce pour faire c'est de créer une fonction utilisateur dans la base de données qui appelle simplement ISDATE comme renvoie le Valeur

CREATE FUNCTION My_ISDATE(@maybeDate varchar(max)) 
    returns bit 
    as return ISDATE(@maybeDate); 

Puis ajouter My_IsDate vous contexte de base de données, et l'utiliser dans la recherche:

var db = SomeDataContext; 
var query = from p in db.MyTable 
where db.My_ISDATE(p.field1) 
select p; 
+0

cool, ça a l'air de pouvoir marcher. comment fusionner les séquences de requête à partir de 2 contextes différents? en rejoignant les tables? de types différents? désolé si cela semble être une question novice. Je suis assez nouveau à DLINQ. Je profite de l'exécution différée de LINQtoSQL pour construire mes requêtes. – stevenjmyu

2

Je ne pense pas qu'il existe une méthode d'extension mappée à ISDATE lors de l'utilisation de LINQ to SQL.

Si vous acceptez de charger toutes les données, puis d'effectuer le filtrage dans l'espace client, utilisez TryParse sur le champ et comparez avec la date.

Sinon, je créerais une procédure stockée qui retournerait les données que vous voulez (de sorte que vous pouvez utiliser ISDATE), puis l'exécuterait dans le contexte.

En outre, votre syntaxe pour l'utilisation de ISDATE est incorrecte. ISDATE vous indique simplement si l'expression est un format de date valide. Votre requête ressemblerait à ceci:

var query = SomeDataContext; 
    query = from p in query 
    where ISDATE(field1) != 0 && CONVERT(datetime, field1) > some date 
    select p; 

La syntaxe est pas valide, mais il vous donne une idée de la façon de former la requête.

+0

Je pourrais essayer d'utiliser TryParse, mais l'ensemble de retour est assez grand. Je vais voir comment sera la performance. Merci. – stevenjmyu

+0

@steven: Je vous suggère vraiment d'essayer la route SP, comme si le jeu de résultats est grand, vous allez être tué sur la performance. – casperOne

+0

fera, merci. aller avec la solution de Jame. – stevenjmyu