2010-11-03 18 views
10

No crea que se trata de un reenvío, es difícil buscar la palabra entre porque se usa en todo (como buscar AND).Equivalente a SQL Between Statement Uso de Linq o una expresión Lambda

Quiero filtrar una lista basada en un rango de fechas.

Tengo una lista con algunas fechas y quiero filtrarlas por un rango de fechas. ¿Existe un equivalente de Linq o Lambda de la declaración between en SQL.

Por ejemplo, el siguiente código no funcionará en LINQPad (o Visual Studio):

void Main() 
{ 
    List<ListExample> list = new List<ListExample>(); 

    list.Add(new ListExample("Name1","23 Aug 2010")); 
    list.Add(new ListExample("Name2","23 Aug 2009")); 

    var query = from l in list 
     where l.DateValue between "01 Jan 2010" and "01 Jan 2011" 
     select l; 

} 

public class ListExample 
{ 

    public ListExample(string name, string dateValue) 
    { 
     Name = name; 
     DateValue = DateTime.Parse(dateValue); 
    } 

    public string Name{get;set;} 
    public DateTime DateValue{get;set;} 
} 
+1

parece un duplicado de: http://stackoverflow.com/questions/1447635/linq-between-operator –

Respuesta

25

Algo como esto?

var query = from l in list 
      where l.DateValue >= new DateTime(2010, 1, 1) 
       && l.DateValue <= new DateTime(2011, 1, 1) 
      select l; 

Usted puede escribir su propio método de extensión:

public static bool IsBetween(this DateTime dt, DateTime start, DateTime end) 
{ 
    return dt >= start && dt <= end;  
} 

En cuyo caso, la consulta sería algo como (sintaxis del método para variar):

var start = new DateTime(2010, 1, 1); 
var end = new DateTime(2011, 1, 1); 
var query = list.Where(l => l.DateValue.IsBetween(start, end)); 

te veo' He proporcionado algunas muestras con las fechas como cadenas. Me gustaría Definitivamente mantener la lógica de análisis (DateTime.ParseExact u otra) separada de la consulta, si es posible.

+0

Gracias, estaba teniendo problemas con el> = y la necesidad de crear un DateTime. Me parece un poco confuso Linq porque cambiaron la sintaxis. – Simon

+0

@Simon: Saludos. El '> =' no tiene mucho que ver con LINQ; es un operador sobrecargado en 'DateTime'. Puede usar' DateTime.CompareTo' o similar si lo prefiere. – Ani

+0

Gracias Ani: el DateTime.Parse fue solo para mi ejemplo en LinqPad ya que no quería publicar un código de cliente en internet. – Simon

1
var query = from l in list 
     where new DateTime(1,1,2010) <= l.DateValue and DateValue <= new DateTime(1,1,2011) 
     select l; 

por supuesto, normalmente advertencia sobre las zonas horarias y diferentes momentos en los clientes y servidores de aplicación

+0

Parece que los métodos de extensión no son compatibles con Linq para Entidades si me enlace con el marco de entidad. ¿Esto suena correcto o me estoy perdiendo algo? – Simon

+1

NotSupportedException: El método 'Boolean IsBetween (System.Nullable'1 [System.DateTime], System.DateTime, System.DateTime, Boolean)' no tiene traducción soportada a SQL. – Simon

1
Datetime DT1 = DateTime.Parse("01 Jan 2010"); 
Datetime DT2 = DateTime.Parse("01 Jan 2011"); 
var query = from l in list 
      where l.DateValue >= DT1 && l.DateValue <= DT2 
      select l; 

en LINQ utiliza el & & y || como lo haría en una declaración booleana normal de C#.

Cuestiones relacionadas