如何排序<tentity>未知的动态通用列表?

时间:2017-09-13 05:38:42

标签: c# linq sorting generics

Upadate:

我准备了一个通用函数来捕获数据库行以生成列表。我的方法就是这样的。

    public class GenericDataAccess<TEntity> : IGenericRepository<TEntity> where TEntity : class
    {
        internal ELearningDBContext ELearningDBContext;
        internal DbSet<TEntity> ELearningDBSet;

        public GenericDataAccess(ELearningDBContext context)
        {
            this.ELearningDBContext = context;
            this.ELearningDBSet = context.Set<TEntity>();
        }
        public virtual PagingModel<TEntity> GetAllPaged(int pagesize, NameValueCollection queryString)
        {
            return ELearningDBSet.AsQueryable().ToList();
        }
     }

这里我要面对排序此列表的问题。因为TEntity正在不断变化。但是,我在名为Entity的每个Id中都有一个公共字段。所以我想按Id顺序按descending对每个模型进行排序。

我试过这种方式。但它没有效果,而且它产生了一个例外。

ELearningDBSet.AsQueryable()..OrderByDescending(i=>typeof(TEntity).GetProperty("Id")).ToList();

我已经完成了这些问题Q1Q2Q3Q4。但是,这些都没有效果。我更喜欢C#代码。任何一种完美的解决方案都非常受欢迎。谢谢。

3 个答案:

答案 0 :(得分:2)

为所有数据实体创建一个实现

的界面
public interface IEntityBase
{
    long Id { get; set; }
}

然后在您的数据类中,在您的情况TEntity中,实施IEntityBase界面。

public partial class MyTEntity: IEntityBase
{
    public long Id { get; set; }

    //Other attributes as needed.
}

在通用类GenericDataAccess<TEntity>中添加约束以使TEntity实现新接口IEntityBase。然后在GetAllPaged方法中使用IEntityBase.Id属性添加OrderByDescending()方法调用。

public class GenericDataAccess<TEntity> : IGenericRepository<TEntity> where TEntity : class, IEntityBase
    {
        internal ELearningDBContext ELearningDBContext;
        internal DbSet<TEntity> ELearningDBSet;

        public GenericDataAccess(ELearningDBContext context)
        {
            this.ELearningDBContext = context;
            this.ELearningDBSet = context.Set<TEntity>();
        }
        public virtual PagingModel<TEntity> GetAllPaged(int pagesize, NameValueCollection queryString)
        {
            return ELearningDBSet.AsQueryable().OrderByDescending(o => o.Id).ToList();
        }
     }

更新:partial课程添加了MyEntity描述符。

答案 1 :(得分:2)

哇!!我刚刚得到了一个很棒的解决方案。我刚刚用过它。

 ELearningDBSet.AsQueryable().SortBy("Id" + " Desc").ToList();

这里我使用的SortBy()函数是从名为System.Web.UI.WebControls.QueryExtensions的.Net库中获取的。有关详细信息,请参阅here。对我来说,这真是一个非常棒的解决方案。

答案 2 :(得分:1)

您可以自己构建Expression tree,例如

public static IQueryable<T> Sort<T>(this IQueryable<T> source, string field)
{
    var p = Expression.Parameter(typeof(T));
    var exp = Expression.Property(p, field);
    return source.OrderBy(Expression.Lambda<Func<T, object>>(exp, p));
}