2010-11-03 11 views
10

Non pensare che questo sia un repost, difficile da cercare tra le parole perché è usato in tutto (come la ricerca di AND).Equivalente di SQL tra istruzione usando Linq o un'espressione Lambda

Desidero filtrare un elenco basato su un intervallo di date.

Ho una lista con alcune date e voglio filtrarle per un intervallo di date. Esiste un equivalente Linq o Lambda dell'istruzione between in SQL.

Per esempio, il codice qui sotto non funzionerà in 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

sembra un duplicato di: http://stackoverflow.com/questions/1447635/linq-between-operator –

risposta

25

qualcosa di simile?

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

È possibile scrivere il proprio metodo di estensione:

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

Nel qual caso la query sarebbe simile (sintassi del metodo per cambiare):

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

ti vedo' Abbiamo fornito alcuni esempi con le date come stringhe. Vorrei sicuramente mantenere la logica di analisi (DateTime.ParseExact o altro) separata dalla query, se possibile.

+0

Grazie ho avuto problemi con il = = e la necessità di creare un DateTime. Trovo che Linq abbia un po 'di confusione perché hanno modificato la sintassi. – Simon

+0

@Simon: Saluti. '> =' Non ha molto a che fare con LINQ; è un operatore sovraccarico in "DateTime". Puoi usare "DateTime.CompareTo' o simile se preferisci. – Ani

+0

Grazie Ani - il DateTime.Parse era solo per il mio esempio in LinqPad perché non volevo pubblicare un codice client su 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; 

naturalmente, di solito avvertimento circa fusi orari e tempi diversi su client e server si applicano

+0

Sembra che i metodi di estensione non siano supportati da Linq alle entità se collego al framework entità. Questo suona corretto o mi manca qualcosa. – Simon

+1

NotSupportedException: Il metodo 'Boolean IsBetween (System.Nullable'1 [System.DateTime], System.DateTime, System.DateTime, Boolean)' non ha traduzioni supportate in 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; 

in LINQ si utilizza il & & e || come faresti in una normale dichiarazione booleana di C#.