Метод расширения ThenBy
относится к классу System.Linq.Queryable
, а не к IOrderedQueryable
. Вам просто нужно заменить это в своем коде:
public static IOrderedQueryable<TEntity> ThenById<TEntity>(
this IOrderedQueryable<TEntity> source)
{
//snip
var resultExpression = Expression.Call(
typeof(System.Linq.Queryable),
command,
new Type[] { type, property.PropertyType },
source.Expression,
Expression.Quote(orderByExpression));
return (IOrderedQueryable<TEntity>)source.Provider.CreateQuery<TEntity>(resultExpression);
}
Обратите внимание, что метод должен расширяться IOrderedQueryable
, а не только IQueryable
.
Однако, это завершится с ошибкой во время выполнения, если TEntity
не имеет свойства Id
. Я бы предпочел дать всем объектам со свойством Id
интерфейс и использовать здесь общее ограничение. Таким образом вы полностью избегаете выражений и получаете безопасность времени компиляции. Например:
public interface IHasId
{
int Id { get; set; }
}
public class SomeEntity : IHasId
{
public int Id { get; set; }
public string Name { get; set; }
//etc
}
Что упрощает ваш метод расширения:
public static IOrderedQueryable<TEntity> ThenById<TEntity>(
this IOrderedQueryable<TEntity> source)
where TEntity : IHasId
{
return source.ThenBy(e => e.Id);
}