2013-08-12 18 views
0

我可以使用屬性訂購實體:如何以通用方式按鍵排序實體?

context.MySet.OrderBy(entity => entity.Id); 

但在這裏,我要知道PK是隻有一個名爲「ID」列。

I'need通用的排序方式。

context.Set<TEntity>().OrderByPk() 

因此,我可以保證客戶端總是以相同的順序接收實體。

我可以創建OrderBy()ThenBy()的序列,但這兩種方法都需要通用的Expression<Func<TEntity,TKey>>。但是,如果我使用泛型類型,我不知道鍵的類型,直到運行時。

我已經創建了函數來獲取排序的外觀,但我不知道如何將它們「附加」到查詢中。

public IEnumerable<Expression> GetKeys<TDbEntity>() where TDbEntity : class 
{ 
    var keyMembers = (this as IObjectContextAdapter).ObjectContext.MetadataWorkspace.GetItem<EntityType>(typeof(TDbEntity).FullName, true, DataSpace.OSpace).KeyMembers; 
    foreach (var keyMember in keyMembers) 
    { 
     var parameter = Expression.Parameter(typeof (TDbEntity)); 
     var expression = Expression.Lambda(Expression.Property(parameter, keyMember.Name), parameter); 
     yield return expression; 
    } 
} 
+0

這些信息是有幫助的: http://stackoverflow.com/questions/41244/dynamic-linq-orderby-on- ienumerablet http://stackoverflow.com/questions/2841585/create-linq-to-entities-orderby-expression-on-the-fly http://stackoverflow.com/questions/12564545/設置鍵的內部順序逐個條款-in-LINQ的動態 –

回答

0

這個Jon's answer是非常有幫助的。

那我只能返回字符串鍵屬性並調用OrederByPropertyThenByProperty