Я пытаюсь объединить следующие выражения в одно выражение: item => item.sub, sub => sub.key, чтобы стать item => item.sub.key. Мне нужно сделать это, чтобы я мог создать метод OrderBy, который переводит селектор элементов отдельно в селектор ключей. Этого можно добиться, используя одну из перегрузок OrderBy и предоставив IComparer<T>
, но это не будет преобразовано в SQL.
Ниже приведена сигнатура метода для дальнейшего разъяснения того, чего я пытаюсь достичь, а также реализация, которая не работает, но должна проиллюстрировать суть.
public static IOrderedQueryable<TEntity> OrderBy<TEntity, TSubEntity, TKey>(
this IQueryable<TEntity> source,
Expression<Func<TEntity, TSubEntity>> selectItem,
Expression<Func<TSubEntity, TKey>> selectKey)
where TEntity : class
where TSubEntity : class
{
var parameterItem = Expression.Parameter(typeof(TEntity), "item");
...
some magic
...
var selector = Expression.Lambda(magic, parameterItem);
return (IOrderedQueryable<TEntity>)source.Provider.CreateQuery(
Expression.Call(typeof(Queryable), "OrderBy", new Type[] { source.ElementType, selector.Body.Type },
source.Expression, selector
));
}
который будет называться:
.OrderBy(item => item.Sub, sub => sub.Key)
Это возможно? Есть ли способ лучше? Причина, по которой я хочу, чтобы метод OrderBy работал таким образом, заключается в поддержке сложного выражения выбора ключа, которое применяется ко многим сущностям, хотя они отображаются по-разному. Кроме того, я знаю способ сделать это, используя строковые представления глубоких свойств, но я пытаюсь сохранить его строго типизированным.