Второй тип выражения, переданного в метод расширения OrderBy, выводится из типа, возвращаемого выражением.Это ожидает выражения>.Поэтому, если вы собираетесь хранить выражение сортировки, вам нужно явно присвоить ему тип TOrderBy.
public MyRepository<Post>
{
public Expression<Func<Post, DateTime>> DefaultOrder;
public MyRepository()
{
DefaultOrder = p => p.PublishedOn;
}
public IQueryable<Post> All()
{
var entities = new MyDbContext().Set<Post>();
return entities.OrderByDescending(DefaultOrder);
}
}
.NET не поддерживает упаковку / распаковку универсального типа параметра, если вы не используете .NET 4.0и используйте интерфейсы через ковариацию и контравариантность, которые не будут работать для вашего примера.
Опять же, это просто, как работает общая система в .NET.Единственная причина, по которой это работает ...
Query.OrderBy(x => x.PublishedOn)
... в том, что тип TOrderBy может быть выведен из типа возвращаемого выражения (DateTime).