12

Don't think this is a repost, difficult to search for the word between because it is used in everything (like searching for AND).

I want to filter a list based on a date range.

I have a list with some dates and I want to filter them by a date range. Is there a Linq or Lambda equivalent of the between statement in SQL.

For example, the code below will not work in Linqpad (or 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

3 Answers 3

28

Something like this?

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

You can write your own extension method:

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

In which case the query would look something like (method syntax for a change):

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

I see you've provided some samples with the dates as strings. I would definitely keep the parsing logic (DateTime.ParseExactor other) separate from the query, if at all possible.

Sign up to request clarification or add additional context in comments.

5 Comments

Thanks I was having problems with the >= and needing to create a DateTime. I find Linq a little confusing because they changed the syntax.
@Simon: Cheers. The >= doesn't have much to do with LINQ; it's an overloaded operator on DateTime. You can use DateTime.CompareTo or similar if you prefer.
Thanks Ani - the DateTime.Parse was just for my example in LinqPad as I did not want to post a clients code onto the internet.
the only thing i've done is to change the extention function to stattic for global usage
How would you rewrite your extension method to support Linq to Entities?
1
var query = from l in list
        where new DateTime(1,1,2010) <= l.DateValue and DateValue <= new DateTime(1,1,2011)
        select l;

of course, normally warning about timezones and different times on clients and servers apply

2 Comments

Looks like the extension methods are not supported by Linq to Entities if I link to the entity framework. Does this sound correct or am I missing something.
NotSupportedException: Method 'Boolean IsBetween(System.Nullable`1[System.DateTime], System.DateTime, System.DateTime, Boolean)' has no supported translation to SQL.
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 you use the && and || like you would in a normal boolean statement of C#.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.