I like to use an interface IBaseEntity that has an Id property of type T. That would make your query:
void DoStuff<IBaseEntity>(...)
{
IQueryable<IBaseEntity> queryable = ... // given
var sortedQueryable = queryable.OrderById(e=> e.Id); //extension method
...
}
Extension Method:
public static IQueryable<IBaseEntity<T>> OrderById<T>(this IQueryable<IBaseEntity<T>> query)
{
return query.OrderBy(e => e.Id);
}
Each entity would implement IBaseEntity and have something like
public partial class MyEntity : IBaseEntity<long>
{
[Required]
public override long Id
{
get { return base.Id;}
set { base.Id = value;}
}
}
Then in the context
modelBuilder
.Entity<MyEntity>()
.ToTable("DatabaseTable", "DatabaseSchema")
.HasKey(e => e.Id)
.Property(e => e.Id)
.HasColumnName("DatabasePrimaryKey")
.HasDatabaseGeneratedOption(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Identity);
Note: This requires some setup in the context and entities. The database can have whatever keys you want, you're mapping them individually to the property Id in the OnModelCreating method of the context.