Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq 复杂对象上的MvcContrib网格排序_Linq_Sorting_Grid_Sql Order By_Mvccontrib - Fatal编程技术网

Linq 复杂对象上的MvcContrib网格排序

Linq 复杂对象上的MvcContrib网格排序,linq,sorting,grid,sql-order-by,mvccontrib,Linq,Sorting,Grid,Sql Order By,Mvccontrib,我正在尝试使用MvcContrib网格控制。但我似乎无法对包含其他对象的复杂对象进行排序 我已经设置了类似于此问题中OP的控制器/类/视图。 我尝试将SortColumnName用于我的childobject.property,但它给我一个错误,说我的主对象没有此属性。这是我的代码片段 //POCO类 class Issue { public int ID {get; get; } ..... public int priorityId {get; set;} publ

我正在尝试使用
MvcContrib
网格控制。但我似乎无法对包含其他对象的复杂对象进行排序

我已经设置了类似于此问题中OP的控制器/类/视图。

我尝试将SortColumnName用于我的childobject.property,但它给我一个错误,说我的主对象没有此属性。这是我的代码片段

//POCO类

class Issue {
   public int ID {get; get; }
   .....
   public int priorityId {get; set;}
   public virtual Priority priority {get; set;}
}
//控制器代码

    public ViewResult Index(int? pageNo, GridSortOptions sort)
    {
        var issues = db.issues.Include(i => i.priority);
        ViewBag.sort = sort; 

        if (!string.IsNullOrEmpty(sort.Column))
        {
            issues = issues.OrderBy(sort.Column, sort.Direction);
        }
        return View(issues.ToList().AsPagination(pageNo ?? 1, 10));
    }
//查看网格的代码

@Html.Grid(Model).Sort(ViewBag.sort as GridSortOptions).Columns(column => {
    column.For(issue => Html.ActionLink(" ", "Edit", new { id = issue.ID, areas = "Issues", controller = "Main"}, new { @id="editBtn"})).Named("Edit");
    column.For(issue => Html.ActionLink(issue.ID.ToString(), "Edit", new {id = issue.ID, areas = "Issues", controller = "Main"})).Named("ID").Sortable(true);
     column.For(issue => issue.priority.codeDesc).Named("Priority").SortColumnName("priority.codeDesc").Sortable(true);
}).Empty("No data found")
当我尝试对优先级字符串进行排序时,会出现一个错误,提示“priority.codeDesc不是问题的属性”


TIA

这里的问题实际上与网格无关,而是与作为MvcContrib排序扩展的一部分提供的.OrderBy扩展方法有关。这个扩展相当简单,我写它只是为了涵盖一些简单的情况,您希望对对象的直接属性进行排序,但是在您的情况下,您试图对嵌套属性(“priority.codeDesc”)进行排序,这是不受支持的-您不能在这个扩展中使用点表示法

您可能需要切换到使用不同的机制来执行实际的排序,或者如果这是一次性的情况,则可以硬编码此特定列的排序逻辑(不理想,但如果是一次性的,则比编写新的排序机制更简单),例如:

天哪!圆点

我也在同一条船上,但感谢上帝,我找到了一个由我们的开发伙伴发布的绝妙解决方案。我在谷歌上搜索了3个小时后发现了它,就在我决定用
MvcContrib
Grid来提高分页和排序的时候

你可以在这里找到完整的帖子:

他的密码救了我…:D功能的使用非常棒!库多兹对他说

我不得不稍微修改Jarretts的原始代码,使之适合我的需要。下面是我修改后的代码:

public static IQueryable<T> OrderBy<T>(this IQueryable<T> collection, GridSortOptions sortOptions)
{
    if (string.IsNullOrEmpty(sortOptions.Column))
    {
        return collection;
    }

    Type collectionType = typeof(T);

    ParameterExpression parameterExpression = Expression.Parameter(collectionType, "p");

    Expression seedExpression = parameterExpression;

    Expression aggregateExpression = sortOptions.Column.Split('.').Aggregate(seedExpression, Expression.Property);

    MemberExpression memberExpression = aggregateExpression as MemberExpression;

    if (memberExpression == null)
    {
        throw new NullReferenceException(string.Format("Unable to cast Member Expression for given path: {0}.", sortOptions.Column));
    }

    LambdaExpression orderByExp = Expression.Lambda(memberExpression, parameterExpression);

    const string orderBy = "OrderBy";

    const string orderByDesc = "OrderByDescending";

    Type childPropertyType = ((PropertyInfo)(memberExpression.Member)).PropertyType;

    string methodToInvoke = sortOptions.Direction == MvcContrib.Sorting.SortDirection.Ascending ? orderBy : orderByDesc;

    var orderByCall = Expression.Call(typeof(Queryable), methodToInvoke, new[] { collectionType, childPropertyType }, collection.Expression, Expression.Quote(orderByExp));

    return collection.Provider.CreateQuery<T>(orderByCall);
}
其中,
sort
是位于
MvcContrib.UI.Grid
中的GridSortOptions

sort.ColumnName
现在可以包含如下字符串:

User.UserName
User.MyRelatedEntity.RelatedEntityProperty
User.MyRelatedEntity.RelatedEntityProperty.AndSoON 
请注意,创建轴网柱时,可以指定

.SortColumnName("User.UserName")

谢谢你的回复,杰里米。我有一大堆这些嵌套属性,所以在这种情况下可能并不理想。有没有可能很快将其添加到MvcContrib代码中?就我个人而言,我没有任何添加此代码的计划-我不再积极参与MvcContrib代码库的工作(但如果其他人想提供此代码,我很乐意将其合并到中)。实际上,我建议尽可能保持视图模型的平面化,不要依赖视图中复杂的对象图来简化。我肯定有点晚了
User.UserName
User.MyRelatedEntity.RelatedEntityProperty
User.MyRelatedEntity.RelatedEntityProperty.AndSoON 
.SortColumnName("User.UserName")