Обычно вы делаете это не так, как вы описали (используя интерфейс IQueryable), а скорее используете выражения типа Expression<Func<TResult, T>>
.Сказав это, вы объединяете функции более высокого порядка (например, where
или select
) в запрос и передаете выражения, которые "заполнят" желаемую функциональность.
Например, рассмотрите сигнатуруметод Enumerable.Where
:
Where<TSource>(IEnumerable<TSource>, Func<TSource, Boolean>)
Функция принимает делегата в качестве второго аргумента, который вызывается для каждого элемента.Значение, которое вы возвращаете из этого делегата, указывает функции более высокого порядка, будет ли она давать текущий элемент (включить его в результат или нет).
Теперь давайте взглянем на Queryable.Where
:
Queryable.Where<TSource>-Methode (IQueryable<TSource>, Expression<Func<TSource, Boolean>>)
Мы можем наблюдать тот же шаблон функции более высокого порядка, но вместо делегата Func<>
требуется выражение.Выражение - это в основном представление данных вашего кода.Компиляция этого выражения даст вам реальный (исполняемый) делегат.Компилятор выполняет тяжелую работу по созданию деревьев выражений из лямбд, которые вы назначаете для Expression<...>
.Деревья выражений позволяют скомпилировать описанный код для разных источников данных, таких как база данных SQL Server.
Чтобы вернуться к вашему примеру, я думаю, что вы ищете селектор .Селектор берет каждый элемент ввода и возвращает его проекцию.Это подпись выглядит так: Expression<Func<TResult, T>>
.Например, вы можете указать это:
Expression<Func<int, string>> numberFormatter = (i) => i.ToString(); // projects an int into a string
Чтобы передать селектор, ваш код должен выглядеть следующим образом:
IQueryable<T> testAdd<T>(IQueryable<T> query, Expression<Func<string, T>> selector, string find)
{
// how can I combine the select expression with StartsWith?
return query.Select(selector) // IQueryable<string> now
.Where(x => x.StartsWith(find));
}
Этот селектор позволит вам спроецировать вводСтрока до нужного типа.Надеюсь, я правильно понял ваше намерение, трудно понять, чего вы пытаетесь достичь.