Я вырезал часть кода для приложения для отчетов.Я получил много интерфейсов, например
public interface IDateRangeSearchable
{
DateTime StartDate { get; }
DateTime EndDate { get; }
}
, которые я затем создал вспомогательные методы для доступа к выражениям и добавления их, без необходимости переписывать одну и ту же логику снова и снова, также пытаясь сохранить согласованность и бизнес-логикув одном месте:
public static Expression<Func<Thingy, bool>> AddDateRangeFilterExpr<T>(this T model, Expression<Func<Thingy,bool>> webOrderItemExpr)
where T : IDateRangeSearchable
{
return webOrderItemExpr.AndAlso(thing => thing.Date >= model.StartDate && thing.Date <= model.EndDate);
}
AndAlso - это пользовательская функция, которая по существу объединяет выражения, чтобы избежать использования нескольких операторов Where.
Но вот проблема, которую я вижу, развиваясь из этого шаблона:
Вариант 1: Мне нужно написать собственную реализацию «AddDateRangeFilterExpr» для объекта сущности «Thingy1», «Thingy2, до бесконечности.
Проблема: это не сухо. Вероятно, то, что я буду делать вначале, так как я в основном занимаюсь 3 или 4 объектами сущностей и предпочитаю дублирование неправильной абстракции. Но я ищу здесь правильный, поскольку можно добавить еще.
Вариант 2: Я добавляю интерфейс к объекту сущности с полем «Дата» и переписываюподпись.
Проблема : поля даты, с которыми я имею дело, меняются .. обнуляются, не обнуляются, и могут иметь имена «Дата», «DateAdded», «thingDate» и т. д. Значение нескольких интерфейсовИ реализации, неуклюжие, не сухие, вероятно, еще хуже ..
Вариант 3: ???
Назовите меня сумасшедшим, но я еще не волшебник выражений.Я очень заинтересован в них, хотя.Я хочу знать, возможно ли преобразовать выражение из:
Expression<Func<Thingy, DateTime?>> dateExpr = t => t.Date;
в
Expression<Func<Thingy, bool>> thingExpr = t => t.Date >= someDate;
, что позволило бы мне просто передать выражение, которое затем выполнит этот фильтр датыв указанном столбце.
thingExpr = model.AddDateRangeFilterExpr(thingExpr, dateExpr);
Тогда мне потребуется реализация только для DateTime и DateTime?и некоторые объекты сущностей с несколькими столбцами даты, я мог бы выбрать разные столбцы даты в зависимости от того, что было нужно.
Или другими словами, можно ли как-то преобразовать предикат (правильный термин?) из даты в логическое значениепостроен из столбца этого поля даты?
Извините, я действительно нахожусь здесь на грани своих знаний с выражениями, поэтому мой язык становится менее точным, когда я вхожу в то, что я не понимаю полностью, япросто здесь, чтобы определить, могут ли мои желаемые мысли принести плоды в этом направлении.Также открыт для критики в отношении всего подхода или ресурсов для получения дополнительной информации о выражениях, связанных с этим.