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();
我已经完成了这些问题Q1,Q2,Q3,Q4。但是,这些都没有效果。我更喜欢C#
代码。任何一种完美的解决方案都非常受欢迎。谢谢。
答案 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));
}