Я пытаюсь объединить следующие выражения в одно выражение: 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, работающий таким образом, состоял в том, чтобы поддерживать сложное выражение выбора ключа, которое применяется ко многим объектам, хотя они представлены различными способами. Кроме того, мне известен способ сделать это, используя строковые представления глубоких свойств, но я стараюсь держать его строго типизированным.