2010-05-20 4 views
3

Je souhaite interroger une table avec certaines conditions en fonction de la saisie par l'utilisateur.LINQ - Multiple Où basé sur les conditions

Je possède ce code:

IQueryable<Turno> turnoQuery = dc.Turno; 

    if (helper.FechaUltimaCitaDesde != DateTime.MinValue) 
    { 
     turnoQuery = turnoQuery.Where(t => t.TurnoFecha >= helper.FechaUltimaCitaDesde); 
    } 
    if (helper.FechaUltimaCitaHasta != DateTime.MinValue) 
    { 
     turnoQuery = turnoQuery.Where(t => t.TurnoFecha <= helper.FechaUltimaCitaHasta); 
    } 

    if (helper.SoloCitasConsumidas) 
    { 
     turnoQuery = turnoQuery.Where(t => t.Estado == Convert.ToInt32(EnmEstadoDelTurno.Consumido)); 
    } 
    else if(helper.AnuladoresDeCitas) 
    { 
    turnoQuery = turnoQuery.Where(t => t.Estado == Convert.ToInt32(EnmEstadoDelTurno.Cancelado) || t.Estado == Convert.ToInt32(EnmEstadoDelTurno.Ausente)); 
    } 

Le problème que je vais avoir est que la clause « où » est écrasé par le dernier.

Quelle est la bonne façon de faire quelque chose comme ça sur LINQ?

L'objet "helper" est une classe personnalisée stockant les dates d'entrée utilisateur pour cet exemple.

+1

Utilisez le bouton de code s'il vous plaît pour rendre votre code plus lisible. – Femaref

+0

Qu'entendez-vous par "se trémousse avec le dernier"? –

+0

J'ai déjà modifié pour rendre le code plus lisible. Était une mauvaise pâte. Ce que je veux dire par "obtient étagé .." est que la seule où la clause qui reste sur la requête est le dernier. C'est comme si elle ne supporte que la clause ONE et utilise toujours le dernier auquel elle a accédé. Est-ce plus clair maintenant? Sry pour mon anglais: S – Bathan

Répondre

1

Vous pouvez combiner les expressions en utilisant une série d'opérations ternaires. Ceci n'est pas testé, donc il y a peut-être quelques problèmes de syntaxe, mais voici l'idée de base:

turnoQuery = turnoQuery.Where(
    t => t.TurnoFecha >= helper.FechaUltimaCitaDesde != DateTime.MinValue ? helper.FechaUltimaCitaDesde : DateTime.MinValue && 
     t.TurnoFecha <= helper.FechaUltimaCitaHasta != DateTime.MinValue ? helper.FechaUltimaCitaHasta : DateTime.MaxValue && 
     helper.SoloCitasConsumidas ? t.Estado == Convert.ToInt32(EnmEstadoDelTurno.Consumido : 
      t.Estado == Convert.ToInt32(EnmEstadoDelTurno.Cancelado) || t.Estado == Convert.ToInt32(EnmEstadoDelTurno.Ausente) && 
     helper.FechaUltimaCitaDesde != DateTime.MinValue ? t.TurnoFecha >= helper.FechaUltimaCitaDesde : t.TurnoFecha <= helper.FechaUltimaCitaHasta && 
     helper.SoloCitasConsumidas ? t.Estado == Convert.ToInt32(EnmEstadoDelTurno.Consumido) : t.Estado == Convert.ToInt32(EnmEstadoDelTurno.Cancelado) || t.Estado == Convert.ToInt32(EnmEstadoDelTurno.Ausente) 
); 
+0

Je l'ai ré-écrit encore et cela a également fonctionné. Merci pour l'aide mais j'avais un bug mineur et je n'ai pas besoin de ça à la fin. – Bathan

Questions connexes