Эквивалент SQL между выражением с использованием Linq или выражения Lambda

Не думайте, что это repost, трудно найти слово между ними, потому что оно используется во всем (например, для поиска AND).

Я хочу отфильтровать список на основе диапазона дат.

У меня есть список с некоторыми датами, и я хочу отфильтровать их по диапазону дат. Есть ли Linq или Lambda эквивалент оператора between в SQL.

Например, приведенный ниже код не будет работать в Linqpad (или 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

Что-то вроде этого?

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

Вы можете написать свой собственный метод расширения:

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

В этом случае запрос будет выглядеть примерно так (синтаксис метода для изменения):

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

Я вижу, что вы предоставили некоторые образцы с датами в виде строк. Я бы определенно оставил логику разбора (DateTime.ParseExact или другую) отдельно от запроса, если это вообще возможно.

Ответ 2

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

конечно, обычно предупреждение о часовых поясах и разном времени на клиентах и ​​серверах применяется

Ответ 3

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;

в linq вы используете && & и || как и в нормальном булевом выражении С#.