2

在这个实现中,我们必须实体“公司”和“公司”。连接到数据库后,我使用 LINQ to SQL 设计器创建实体对象。公司实体的主页是显示它所属的公司;所以在网格中我们将有这些列:

公司名称 | 公司名称 | 描述

company 表只有公司 ID,没有公司名称;但是 LINQ 提供了加载公司对象和访问公司记录名称的能力。

由于对网格列启用了排序,因此用户可以单击列以按该列(DESC 或 ASC)对结果进行排序

排序适用于CompanyNameDescription但不适用于 * CorporateName *

下面是对网格数据进行排序的代码

var entityType = typeof(Entities.Company);

        //load company list based on Business Unit selected
        var companyList = LoadCompanyRecords());// return type IQueryable<Entities.Company>

        //if filters are used -> filter the results
        companyList = FilterResults(companyList);//return type is IQueryable<Entities.Company>

        // order by work flow starts
        const string ascSortMethodName = "OrderBy";
        const string descSortMethodName = "OrderByDescending";
        var sortMethod = ascSortMethodName;
        var orderdirection = GetSortDirection(e.SortExpression);

        if (orderdirection == "DESC")
            sortMethod = descSortMethodName;

        //var entityType = typeof(Entities.Company);
        var property = entityType.GetProperty(e.SortExpression);
        var parameter = Expression.Parameter(entityType, "p");
        var propertyAccess = Expression.MakeMemberAccess(parameter, property);
        var orderByExp = Expression.Lambda(propertyAccess, parameter);

        MethodCallExpression resultExp = Expression.Call(
                                           typeof(Queryable),
                                           sortMethod,
                                           new Type[] { entityType, property.PropertyType },
                                           companyList.Expression,
                                           Expression.Quote(orderByExp));

        var result = companyList.Provider.CreateQuery<Entities.Company>(resultExp);

        gvAssets.DataSource = result;
        gvAssets.DataBind();

有没有人遇到过这个?以及对不属于当前实体的列进行排序的最佳方法是什么?还是我应该考虑编写一个 sql 连接查询或者可能是一个存储过程?

我很感激任何帮助。

4

1 回答 1

1

对此的临时解决方案是检查该列名称并确保它具有自己的排序功能,如下所示:

var sortColumn = e.SortExpression;

        if (sortColumn == "CorporateGroupName")
        {
            if (orderdirection == "DESC")
                result = companyList.OrderByDescending(x => x.CorporateGroup.CorporateGroupName).ToList();
            else
                result = companyList.OrderBy(x => x.CorporateGroup.CorporateGroupName).ToList();
        }
于 2013-11-14T15:26:45.840 回答