C# 将POCOs与ASP.net数据控件一起使用时实现排序/页面功能

C# 将POCOs与ASP.net数据控件一起使用时实现排序/页面功能,c#,data-binding,gridview,sorting,paging,C#,Data Binding,Gridview,Sorting,Paging,我不太喜欢数据集,所以我使用POCO返回数据。我已经使用自定义方法实现了分页和排序,这些方法是我为一个POCO类型创建的,它可以处理页面大小,并一次给我一组完整的POCO集合,我使用检查单击的DataItem名称和排序顺序的方法来进行排序。对于计划与ASP.net数据控件(如Gridview)一起使用的每个POCO,反复创建这样的方法是非常痛苦的 有没有一种技术可以使这一过程自动化,这样我就不需要每次为新的POCO创建这样的方法,这样它就可以像使用数据表一样工作?如果需要,我可以提供更多的解释

我不太喜欢数据集,所以我使用POCO返回数据。我已经使用自定义方法实现了分页和排序,这些方法是我为一个POCO类型创建的,它可以处理页面大小,并一次给我一组完整的POCO集合,我使用检查单击的DataItem名称和排序顺序的方法来进行排序。对于计划与ASP.net数据控件(如Gridview)一起使用的每个POCO,反复创建这样的方法是非常痛苦的

有没有一种技术可以使这一过程自动化,这样我就不需要每次为新的POCO创建这样的方法,这样它就可以像使用数据表一样工作?如果需要,我可以提供更多的解释

注意:有些人可能将POCO称为DTO


编辑:我在这个主题上找到了这个。这是实现我要做的事情的唯一可能的方法吗?

我创建了一个实体基类。我的DAO就是从中派生出来的,并且具有与表列相对应的属性(大部分情况下)。我的DAL返回任何查询的列表,该列表可绑定到GridView。

我同意基类的想法,因为这样可以保存所有重复的代码。我朝这个方向迈出了一步的一件事是创建一个类来处理任何泛型列表的排序(对于DTO/POCO)。这使我能够在演示者中对列表进行排序,或仅使用一行代码进行代码隐藏

通常,对于SortExpression,我返回要排序的数据的属性名。此外,排序方向将是简单的“上升”或“下降”

List SupplierList=mSupplierService.GetSuppliers();
Sort(新的GenericComparer(mView.SortExpression,mView.SortDirection));
mView.Suppliers=供应商列表;
这是我上过的课

public class GenericComparer<T> : IComparer<T>
 {

     private string mDirection;
     private string mExpression;

     public GenericComparer(string Expression, string Direction)
     {
         mExpression = Expression;
         mDirection = Direction;
     }

     public int Compare(T x, T y)
     {
         PropertyInfo propertyInfo = typeof(T).GetProperty(mExpression);
         IComparable obj1 = (IComparable)propertyInfo.GetValue(x, null);
         IComparable obj2 = (IComparable)propertyInfo.GetValue(y, null);
         if (mDirection == "Ascending") {
             return obj1.CompareTo(obj2);
         }
         else {
             return obj2.CompareTo(obj1);
         }
     }
 }
公共类GenericComparer:IComparer
{
私有字符串定向;
私有字符串表达式;
公共GenericComparer(字符串表达式、字符串方向)
{
mExpression=表达式;
方向=方向;
}
公共整数比较(TX,TY)
{
PropertyInfo PropertyInfo=typeof(T).GetProperty(mExpression);
IComparable obj1=(IComparable)propertyInfo.GetValue(x,null);
IComparable obj2=(IComparable)propertyInfo.GetValue(y,null);
如果(mDirection==“升序”){
返回obj1.CompareTo(obj2);
}
否则{
返回obj2.CompareTo(obj1);
}
}
}

我也可以绑定,您如何排序和分页?我在SQL级别进行排序和分页,主要是因为在我的情况下,我不知道数据是否更改,所以我决定重新查询。另外,在大多数情况下进行排序时,当前页面中的数据本身也会有所不同。我还使用排序事件来确定ASC、DESC以及排序依据的列。@ocdecio=我也在这样做,但我的处理程序需要执行类似于if sortby=“FirstName”{sort by Person.FirstName}的操作。您也在这样做吗?是的。在我的模型中,DAO属性与GridView上的表列名以及模板列id相匹配,这使得将其添加到sort子句变得很容易。我将ASC/DESC存储在一个会话变量中。问题-如果你有,比如说,100000个供应商,这是如何工作的?这是这种方法唯一的缺点。以100000家供应商为例,您需要点击SQL并返回所有记录,将其映射到列表中,然后调用这1行代码进行排序。。。然后将运行所有100000个对象。。。对于成吨的数据来说并不理想。我在下面的网格视图中显示了此DTO排序的更详细版本
public class GenericComparer<T> : IComparer<T>
 {

     private string mDirection;
     private string mExpression;

     public GenericComparer(string Expression, string Direction)
     {
         mExpression = Expression;
         mDirection = Direction;
     }

     public int Compare(T x, T y)
     {
         PropertyInfo propertyInfo = typeof(T).GetProperty(mExpression);
         IComparable obj1 = (IComparable)propertyInfo.GetValue(x, null);
         IComparable obj2 = (IComparable)propertyInfo.GetValue(y, null);
         if (mDirection == "Ascending") {
             return obj1.CompareTo(obj2);
         }
         else {
             return obj2.CompareTo(obj1);
         }
     }
 }