Мне нравится использовать интерфейс IBaseEntity, который имеет свойство Id типа T. Это сделает ваш запрос:
void DoStuff<IBaseEntity>(...)
{
IQueryable<IBaseEntity> queryable = ... // given
var sortedQueryable = queryable.OrderById(e=> e.Id); //extension method
...
}
Метод расширения:
public static IQueryable<IBaseEntity<T>> OrderById<T>(this IQueryable<IBaseEntity<T>> query)
{
return query.OrderBy(e => e.Id);
}
Каждая сущность будет реализовывать IBaseEntity и иметь что-то вроде
public partial class MyEntity : IBaseEntity<long>
{
[Required]
public override long Id
{
get { return base.Id;}
set { base.Id = value;}
}
}
Тогда в контексте
modelBuilder
.Entity<MyEntity>()
.ToTable("DatabaseTable", "DatabaseSchema")
.HasKey(e => e.Id)
.Property(e => e.Id)
.HasColumnName("DatabasePrimaryKey")
.HasDatabaseGeneratedOption(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Identity);
Примечание: это требует некоторой настройки в контексте и сущностях. База данных может иметь любые ключи, которые вы хотите, вы индивидуально сопоставляете их со свойством Id в методе OnModelCreating контекста.