Как передать функцию как выражение в оператор Linq Select? - PullRequest
0 голосов
/ 22 января 2019

У меня есть два метода, которые возвращают минимальную и максимальную даты из таблицы:

private static DateTime? GetNewestDateFromStatistics(IDbConnection db)
{
        return db.Single<DateTime?>(db.From<Statistic>()
                                             .Select(e => Sql.Max(e.DateTimeCest));
}

private static DateTime? GetOldestDateFromStatistics(IDbConnection db)
{
        return db.Single<DateTime?>(db.From<Statistic>()
                                             .Select(e => Sql.Min(e.DateTimeCest));
}

Я хотел бы иметь один метод и динамически передавать Sql.Min или Sql.Max в Select, поэтомуМой метод будет иметь дополнительный параметр.Вот как я попытался:

Expression<Func<Statistic, DateTime>> expMin = i => Sql.Min(i.DateTimeCest);

private static DateTime? GetDateFromStatistics(IDbConnection db, 
                                                 Expression<Func<Statistic, DateTime>> exp)
{
   return db.Single<DateTime?>(db.From<Statistic>()
                                  .Select(e => exp.Compile().Invoke(e)));
}

И вызвал бы мой метод:

GetDateFromStatistics(db, expMin);

Я получил ошибку

'переменная типа' Статистика 'ссылка из области действия '', но она не определена '

Любая помощь будет принята с благодарностью.Спасибо.

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Не уверен, зачем вам вообще нужен Expression, похоже, это работает нормально:

Func<Statistic, DateTime> expMin = i => Sql.Min(i.DateTimeCest);
...
private static DateTime? GetDateFromStatistics(IDbConnection db, 
                                                 Func<Statistic, DateTime> exp)
{
   return db.Single<DateTime?>(db.From<Statistic>().Select(exp));
}
...
GetDateFromStatistics(db, expMin);
0 голосов
/ 23 января 2019

Просто попробуйте это:

private static DateTime? GetDateFromStatistics(IDbConnection db, 
                                               Expression<Func<Statistic, DateTime>> exp)
{
   return db.Single<DateTime?>(db.From<Statistic>()
                                 .Select(exp));
}
...