Манипулирование выражениями Linq, потому что я хочу, чтобы они были волшебными - PullRequest
0 голосов
/ 24 августа 2018

Я вырезал часть кода для приложения для отчетов.Я получил много интерфейсов, например

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?и некоторые объекты сущностей с несколькими столбцами даты, я мог бы выбрать разные столбцы даты в зависимости от того, что было нужно.

Или другими словами, можно ли как-то преобразовать предикат (правильный термин?) из даты в логическое значениепостроен из столбца этого поля даты?

Извините, я действительно нахожусь здесь на грани своих знаний с выражениями, поэтому мой язык становится менее точным, когда я вхожу в то, что я не понимаю полностью, япросто здесь, чтобы определить, могут ли мои желаемые мысли принести плоды в этом направлении.Также открыт для критики в отношении всего подхода или ресурсов для получения дополнительной информации о выражениях, связанных с этим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...