我正在尝试将以下表达式组合成一个表达式: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 方法的原因是支持适用于许多实体的复杂键选择表达式,尽管它们以不同的方式公开。此外,我知道一种使用深层属性的字符串表示来执行此操作的方法,但我试图保持它的强类型。