如何通过密钥以通用方式订购实体?

时间:2013-08-12 10:20:11

标签: .net entity-framework dbcontext

我可以使用属性订购实体:

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

但在这里我要知道PK只有一列名为'Id'。

我需要通用的订购方式。

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

因此,我可以保证客户端始终以相同的顺序接收实体。

我可以创建OrderBy()ThenBy()的序列,但这两种方法都需要通用Expression<Func<TEntity,TKey>>。但是,如果我使用泛型类型I,直到运行时才知道键的类型。

我已经创建了一个函数来获取订阅的次数,但我不知道如何将它们“附加”到查询中。

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;
    }
}

1 个答案:

答案 0 :(得分:0)

Jon's answer非常有帮助。

然后我只能返回关键属性的字符串,并调用OrederByPropertyThenByProperty