2012-01-25 30 views
2

我写一个函数,像这样我在哪里除其他事项外排序模型数据的签名:传递一个字段的功能排序在该领域

public MyModel GetModel(IQueryable<Something> query, string sort, 
    int page, int PageSize) 
{ 
    ... 
    viewModel.Something = query.OrderByDescending(o => sort) 
      .Skip((page - 1) * pageSize).Take(pageSize).ToList(); 
    ... 
} 

问题是我想在传递默认排序参数,这是我想排序,如果参数“排序”为空或空。例如,这可能是:

.OrderByDescending(o => o.AddedDate); 

我已经尝试了各种各样的事情(例如传递函数求)的东西传递给这个函数来告诉它使用AddedDate或不管我选择对记录进行排序如果排序为空,但没有任何工作。我将如何实现这样的事情?

+0

【动态LINQ排序依据]的可能重复(http://stackoverflow.com/questions/41244/dynamic-linq-orderby) – Eranga

回答

3

您的当前代码没有太大意义 - 如果您希望能够通过Something类中的任何字符串属性进行排序,您将按单个值进行排序,而不是您要排序的项目的属性。适当的将是:

public MyModel GetModel(IQueryable<Something> query, Func<Something, string> sort, 
    int page, int PageSize) 
{ 
    Func<Something, string> actualSort = sort ?? (o => o.AddedDate); 
    ... 
    viewModel.Something = query.OrderByDescending(actualSort) 
      .Skip((page - 1) * pageSize).Take(pageSize).ToList(); 
    ... 
} 

现在,如果你在null传为sort排序将AddedDate恢复到默认的排序顺序。

+1

我觉得OP希望能够在运行时动态选择排序键,所以在这种情况下Func不起作用... –

+0

@ThomasLevesque:我不是这样读的,但当然我可能会错 - 直到OP可以澄清。 – BrokenGlass

+0

@Thomas - 这正是我想要做的。 –

1

最好的选择是使用Dynamic Linq。它可以让你通过排序键作为字符串:

query.OrderByDescending(sort)... 
+0

你能给我更多关于如何做到这一点的信息吗? –

+0

将Visual Studio示例中的DynamicQuery.cs文件复制到您的项目中,在您的代码中添加'using System.Linq.Dynamic;',并且您可以轻松前往;你会在我搜索到的intellisense –

+0

中看到新的OrderBy重载,我没有在我的计算机上使用DynamicQuery,即使我这样做了,也不知道它将如何提供帮助。 –