This function returns a lambda expression based on the parameters sent. I am sure there is a better way to do this.
[NonAction]
private Expression<Func<ScheduleItemDto, bool>> Where(Guid siteGuid, Guid? eventGuid, MonthOfYear month, int year, bool? closed)
{
Expression<Func<ScheduleItemDto, bool>> notAdminExpression = x => x.Active == true;
Expression<Func<ScheduleItemDto, bool>> baseExpression = x => x.SiteGuid == siteGuid && x.Date.Month == (int)month + 1 && x.Date.Year == year;
Expression<Func<ScheduleItemDto, bool>> eventExpression = x => x.EventGuid == eventGuid;
Expression<Func<ScheduleItemDto, bool>> closedExpression = x => x.Closed != null;
Expression<Func<ScheduleItemDto, bool>> notClosedExpression = x => x.Closed == null;
Expression<Func<ScheduleItemDto, bool>> resultExpression = x => true;
switch (closed)
{
case null:
if (eventGuid == null)
{
resultExpression = baseExpression;
}
else
{
resultExpression = Expression.Lambda<Func<ScheduleItemDto, bool>>(Expression.AndAlso(baseExpression.Body, eventExpression.Body), baseExpression.Parameters[0]);
}
break;
case true:
if (eventGuid == null)
{
resultExpression = Expression.Lambda<Func<ScheduleItemDto, bool>>(Expression.AndAlso(baseExpression.Body, closedExpression.Body), baseExpression.Parameters[0]);
}
else
{
Expression<Func<ScheduleItemDto, bool>> exp = Expression.Lambda<Func<ScheduleItemDto, bool>>(Expression.AndAlso(baseExpression.Body, closedExpression.Body), baseExpression.Parameters[0]);
resultExpression = Expression.Lambda<Func<ScheduleItemDto, bool>>(Expression.AndAlso(exp.Body, eventExpression.Body), exp.Parameters[0]);
}
break;
case false:
if (eventGuid == null)
{
resultExpression = Expression.Lambda<Func<ScheduleItemDto, bool>>(Expression.AndAlso(baseExpression.Body, notClosedExpression.Body), baseExpression.Parameters[0]);
}
else
{
Expression<Func<ScheduleItemDto, bool>> exp = Expression.Lambda<Func<ScheduleItemDto, bool>>(Expression.AndAlso(baseExpression.Body, notClosedExpression.Body), baseExpression.Parameters[0]);
resultExpression = Expression.Lambda<Func<ScheduleItemDto, bool>>(Expression.AndAlso(exp.Body, eventExpression.Body), exp.Parameters[0]);
}
break;
}
if (!AccessControl.HasAccess(Permissions.DashboardAdministrator))
{
return Expression.Lambda<Func<ScheduleItemDto, bool>>(Expression.AndAlso(resultExpression.Body, notAdminExpression.Body), resultExpression.Parameters[0]);
}
return resultExpression;
}