Если я правильно понимаю, вы почти написали это:
public static string jqGridFilterSelectList<TSource>(
this IQueryable<TSource> source,
Expression<Func<TSource, string>> selector
)
{
var compiled = selector.Compile();
return string.Join(";",
source.Select(x => compiled(x) + ":" + compiled(x))
.Distinct().ToArray()
);
}
//case where we want different text and value
public static string jqGridFilterSelectList<TSource>(
this IQueryable<TSource> source,
Expression<Func<TSource, string>> textSelector,
Expression<Func<TSource, string>> valueSelector
)
{
return string.Join(";",
source.Select(x => valueSelector.Compile()(x) + ":" + textSelector.Compile()(x))
.Distinct().ToArray()
);
}
Вам просто нужно вызвать ваши функции выбора для получения значений.Дайте мне знать, если я неправильно понимаю ваш вопрос.
По второму вопросу: можно ли настаивать на том, что селектор содержит только 1 столбец, простой ответ - нет - селектор может быть практически любымдопустимый Func
, который принимает TSource
и возвращает string
, и нет никакого способа ограничить то, что может быть сделано внутри (если вы не хотите исследовать предоставленное дерево выражений , но это будет более сложным, чемрезультат, конечно).
РЕДАКТИРОВАТЬ : ОК, так что это какой-то поставщик SQL LINQ, Entity Framework?Итак, давайте попробуем немного по-другому.Я не знаю, сработает ли это, но давайте сначала попробуем извлечь данные и объединить объекты:
public static string jqGridFilterSelectList<TSource>(
this IQueryable<TSource> source,
Expression<Func<TSource, string>> selector
)
{
var compiled = selector.Compile();
return string.Join(";",
source.Distinct().AsEnumerable()
.Select(x => compiled(x) + ":" + compiled(x))
.ToArray()
);
}
//case where we want different text and value
public static string jqGridFilterSelectList<TSource>(
this IQueryable<TSource> source,
Expression<Func<TSource, string>> textSelector,
Expression<Func<TSource, string>> valueSelector
)
{
return string.Join(";",
source.Distinct().AsEnumerable()
.Select(x => valueSelector.Compile()(x) + ":" + textSelector.Compile()(x))
.ToArray()
);
}
Дополнительный вызов ToEnumerable
переключает между базами данных и-процессная обработка.Предполагая, что ваши селекторы детерминированы и не имеют побочных эффектов, вы можете работать с уже выбранными TSource
элементами.