关于c#:使用linq对网格视图列进行排序

Sorting grid view column using linq

我正在将数据绑定到模板字段中的GridView,如:

1
2
3
4
     <ItemTemplate>
        '></asp:Label>
     </ItemTemplate>
  </asp:TemplateField>

在代码隐藏中,我只是将列表绑定到网格视图:

1
2
    gvBussinessRisks.DataSource = this.BusinessRiskList;
    gvBussinessRisks.DataBind();

列表属于"商业风险"类型。实体结构就像

2

我的BusinessObjective类具有名为"BusinessObjecteText"的属性,我将其绑定到网格视图中的某一列。

但是,当我试图对这个列进行排序时,会出错。

我的排序事件如下:

1
2
3
4
5
List<BusinessRisk> sortedList = this.BusinessRiskList;

    sortedList.Sort(new GenericComparer<BusinessRisk>(e.SortExpression, (SortDirection)Enum.Parse(typeof(SortDirection), GetSortDirection(e.SortExpression))));
    gvBussinessRisks.DataSource = sortedList;
    gvBussinessRisks.DataBind();

"GenericComparer"类是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public class GenericComparer<T> : IComparer<T>
{
    private string sortExpression;
    private SortDirection sortDirection;
    public GenericComparer(string sortExpression, SortDirection sortDirection)
    {
        this.sortExpression = sortExpression;
        this.sortDirection = sortDirection;
    }

    public int Compare(T x, T y)
    {
        PropertyInfo propertyInfo = typeof(T).GetProperty(sortExpression);
        IComparable obj1 = (IComparable)propertyInfo.GetValue(x, null);
        IComparable obj2 = (IComparable)propertyInfo.GetValue(y, null);


        if (SortDirection == SortDirection.Ascending)
        {
            if (obj1 != null)
                return obj1.CompareTo(obj2);
            return 0;
        }
        else
        {
            if (obj1 != null)
                return obj2.CompareTo(obj1);
            return 0;
        }
    }

    public SortDirection SortDirection
    {
        get { return this.sortDirection; }
        set { this.sortDirection = value; }
    }


}

当我试图将此列排序为GenericComparer类(方法:比较)时,我得到了propertyInfo作为null类。如果我使用BusinessRisk的属性进行排序,那么排序会正常进行,但在这里,我尝试使用bussinessObjective类的属性之一进行排序。

我试过谷歌,但没有找到任何解决方案。


最后,经过大量的谷歌和头脑风暴,我得到了解决方案,使用动态LINQ。

我放弃了泛型比较器类,只是在排序事件中编写了以下代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
string sortColumn = e.SortExpression;
    IQueryable<BusinessRisk> sortedList = (from p in this.BusinessRiskList
                                           select new BusinessRisk
                                           {
                                               BusinessRiskText = p.BusinessRiskText,
                                               IsActive = p.IsActive,
                                               Description = p.Description,
                                               BusinessObjective = new BusinessObjective { BusinessObjectiveText = p.BusinessObjective.BusinessObjectiveText }
                                           }).AsQueryable().OrderBy(e.SortExpression);




    this.BusinessRiskList = sortedList.ToList<BusinessRisk>();
    gvBussinessRisks.DataSource = sortedList;
    gvBussinessRisks.DataBind();

它对我来说是完美的。

谢谢所有帮助我的人。