One thing I found myself doing quite a bit an often causing logic errors was comparing
dates in Linq queries. For example, if I want to get games that occur between a date range, I might be
doing something like this :
public static IQueryable<Competition> GetBetweenDates(DateTime startDate, DateTime endDate)
{
return (from comp in DataContext.Competitions
where comp.Date >= startDate && comp.Date <= endDate
select comp);
}
I then want to get a list of tournaments that occur between a date range, and I might
essentially rewrite this code using a couple different variables. Rather, I can implement
a common interface on these classes and have an expression applied to all classes that
implement this interface.
public interface IDate
{
DateTime Date { get; set; }
}
public partial class Competition : DataBase, IDate
{
...
}
public static class Expressions
{
public static Expression<Func<T, bool>> GetBetweenDates<T>(DateTime start, DateTime end)
where T : IDate
{
return (t => t.Date >= start && t.Date <= end);
}
}
Then, rather than rewriting this for each class with a date, I can just apply this expression
to my queries.
public static IQueryable<Competition> GetBetweenDates(DateTime startDate, DateTime endDate)
{
return (from comp in DataContext.Competitions
select comp).Where(
Expressions.GetBetweenDates<Competition>(startDate, endDate));
}