2009-10-26 6 views
1

J'ai 2 champs de date importants dans db.requête linq avec paramètre pouvant être vide

startTime et GoTime

J'aime créer requête personnalisée dans laquelle un paramètre peut être vide, voir mon exemple

public List<Type> GetAll(DateTime startTime, DateTime goTime) 
{ 
List<Type> getResultBetween = 

    (from i in DB.TABLENAME 
    where i.startTime >= startTime && i.goTime == ANYTHING 
    select i).ToList(); 
    return getResultBetween; 
} 

Alors objectif est maintenant que je reçois tout à l'heure de début donné même la goTime n'est pas défini. Cela devrait aussi fonctionner si je définis le goTime et que le Starttime est vide. Resault devrait me donner tous jusqu'à la fin.

Merci

Répondre

9

Essayez quelque chose comme cela, en utilisant des types nullable et la construction de la requête explicitement:

public List<Type> GetAll(DateTime? startTime, DateTime? goTime) 
{ 
    IQueryable<Type> query = DB.TABLENAME; 
    if (startTime != null) 
    { 
     query = query.Where(i => i.startTime >= startTime.Value); 
    } 
    if (goTime != null) 
    { 
     query = query.Where(i => i.goTime == goTime.Value); 
    } 
    return query.ToList(); 
} 
+0

Vous voulez dire> = startTime;) – JustLoren

+0

Ok, j'espérais que c'est possible de faire avec des clauses complexes où je le fais maintenant. THX. –

+0

mais comment le gérer si je donne les deux paramètres? –

2

Try this "piraté" clause where:

where (i.startTime >= (startTime ?? i.startTime)) && (i.goTime >= (goTime ?? i.goTime)) 

Pour que cela work, startTime et goTime doivent être Nullable <DateTime> (ou DateHeure?).

Cela fonctionne dans tous les scénarios, à savoir quand ...

  1. ou l'autre des paramètres sont nuls
  2. Les deux sont nuls
  3. Les deux ne sont pas nulles
+0

C'est une très bonne solution, mais cela annule l'élément dans le résultat si goTime est null (dans la base de données) et passe une valeur nulle dans le paramètre goTime (avec un startTime non nul). – daxsorbito

+0

Vous avez raison. Mais comme il n'a pas mentionné que les champs sont nullables dans la base de données, j'ai supposé qu'ils ne le sont pas. :) – Yogesh

0

Chose étrange doesn ne fonctionne pas. pour plus d'informations. C'est un webservice mais j'espère que ce n'est pas le problème.

ma méthode ressemble.

public List<FDPGeschaefte> AlleGeschaefteZwischenBestimmtemDatum(string StartDatum, string EndDatum) 
{ 
    IQueryable<FDPGeschaefte> query = DB.FDPGeschaefte; 
    if (StartDatum != null && EndDatum != null) 
    { 
     query = query.Where(i => i.SysCreated > DateTime.Parse(StartDatum) && i.SysCreated <= DateTime.Parse(EndDatum)); 
    } 
    if (StartDatum != null) 
    { 
     query = query.Where(i => i.SysCreated >= DateTime.Parse(StartDatum)); 
    } 
    if (EndDatum != null) 
    { 
     query = query.Where(i => i.SysCreated <= DateTime.Parse(EndDatum)); 
    } 
    return query.ToList(); 
} 

si je tape un seul paramètre dans le webservice. il lance un argument datetime invalide.

+0

Je soupçonne que vos chaînes sont dans le mauvais format alors - ou au moins que l'analyse n'est pas propagée de manière appropriée. Je vous suggère de les analyser * avant * que vous les utilisiez dans la requête. –

0

Bonjour, vous pourriez essayer quelque chose comme ça.

public static List<Type> GetAll(DateTime? startTime, DateTime? goTime) 
    { 
     List<Type> getResultBetween = 
      (from i in DB.TableName 
      where (startTime.HasValue && i.StartTime >= startTime) 
        || (goTime.HasValue && i.GoTime >= goTime) 
      select i).ToList(); 
     return getResultBetween; 
    } 
+0

Cela échouera si les deux valeurs ne sont pas nulles. Il n'a pas mentionné qu'il avait besoin des deux paramètres dans la question, mais comme un commentaire à la réponse de Jon. – Yogesh

+0

Vous avez raison, j'ai raté celui-là. Je pense que vous pourriez jouer sur la modification de la clause where, en ajoutant une restriction si les deux sont nuls. – daxsorbito

Questions connexes