LINQ - 基于条件的多个位置

时间:2010-05-20 17:08:32

标签: c# linq

我想根据用户输入查询具有某些条件的表。

我有这段代码:

   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));
    }

我遇到的问题是“where”子句被最后一个覆盖。

在LINQ上做这样的事情的正确方法是什么?

“helper”对象是一个自定义类,用于存储此示例的用户输入日期。

1 个答案:

答案 0 :(得分:1)

您可以使用一系列三元运算来组合表达式。这没有经过测试,因此可能存在一些语法问题,但这里有基本的想法:

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)
);