我正在研究 Entity Framework 4.0 POCO 并寻找一种方法来在列表页面上使用表/实体中的主键以外的字段对我的网格进行排序。我不想添加自定义页面,尽管它是解决方案之一,因为如果可以这样做,那将是开销。
提前致谢。
我正在研究 Entity Framework 4.0 POCO 并寻找一种方法来在列表页面上使用表/实体中的主键以外的字段对我的网格进行排序。我不想添加自定义页面,尽管它是解决方案之一,因为如果可以这样做,那将是开销。
提前致谢。
如果您返回的结果类似于 IEnumerable< YourPocoClass > 或 IQueryable< YourPocoClass >,您始终可以使用 .OrderBy(p => p.SomePropertyOtherThanPK)
你可以这样做:
var list = yourDbContext.YourDbSet.OrderBy(m=>m.Property);
或者,如果您想按来自客户端网格表单的字符串排序,那么您可以使用 Dynamic Linq: http ://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1 -使用-the-linq-dynamic-query-library.aspx
解决了以下属性的问题。
我添加了一个用于添加排序列的新属性类 - DefaultSortOrderColumn
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public class DefaultSortColumnAttribute : Attribute
{
public DefaultSortColumnAttribute(string sortColumn, bool sortDescending)
{
this.SortColumn = sortColumn;
this.SortDescending = sortDescending;
}
public string SortColumn { get; private set; }
public bool SortDescending { get; private set; }
}
然后将此属性用于部分实体类,即您的实体的元数据类,我们需要为此使用排序列
[DefaultSortColumn("YourSortColumn", false)]
public partial class YourDBEntity
{
}
然后,我们可以在 PageTemplates\List.aspx 中使用该属性来确定是否定义了任何排序列,并使用 Page_Load 中的排序列进行排序。
MetaTable table = GridDataSource.GetTable();
if (!IsPostBack && table.Attributes.OfType<DefaultSortColumnAttribute>().Count() > 0)
{
string sortColumn = table.Attributes.OfType<DefaultSortColumnAttribute>().FirstOrDefault().SortColumn;
bool sortDescending = table.Attributes.OfType<DefaultSortColumnAttribute>().FirstOrDefault().SortDescending;
GridView1.Sort(sortColumn, sortDescending ? SortDirection.Descending : SortDirection.Ascending);
}
该属性可以进一步扩展并设置为属性而不是类。这样,我们就可以对多列进行排序。
感谢那些回复。快乐编码。