Эквивалент 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 вы используете && & и || как и в нормальном булевом выражении С#.