用Dynamic Linq替换我当前的Linq OrderBy

时间:2014-04-07 14:40:57

标签: asp.net-mvc linq asp.net-mvc-4

我的行动方法中有以下代码来订购我的数据: -

if (String.IsNullOrEmpty(sort))
{
    vm = repository.FindVMs(withOutSpace).OrderBy(a => a.Technology.PartialSerial).ToPagedList(page, pagesize);
}
else if(sort == "server_desc")
{
    vm = repository.FindVMs(withOutSpace).OrderByDescending(a => a.ITServer.Technology.PartialSerial).ToPagedList(page, pagesize);
    ViewBag.ServerSortPam = "server_ans";
}
else 
{
    vm = repository.FindVMs(withOutSpace).OrderBy(a => a.ITServer.Technology.PartialSerial).ToPagedList(page, pagesize);
    ViewBag.ServerSortPam = "server_desc";
}

我已安装Linq.Dynamics,但我不知道如何替换当前代码以使用动态linq查询,因此我不必为不同的排序参数手动编写单独的orderBY语句。

主要是制作“OrderByDescending(a => a.ITServer.Technology.PartialSerial)”& “OrderBy(a => a.ITServer.Technology.PartialSerial)”是根据传递的参数动态生成的,而不是必须编写两个不同的linq查询?

由于

1 个答案:

答案 0 :(得分:0)

使用动态linq,OrderBy和OrderByDecending子句看起来像这样:

OrderBy("ITServer.Technology.PartialSerial")

OrderBy("ITServer.Technology.PartialSerial DESC").

如果你想摆脱额外的if语句,传递一个标志而不是一个字符串值可能会有所帮助。例如:

IQueryable<SomeEntityType> ApplySort(IQueryable<SomeEntityType> query, bool? sortByPartialAsc)
{
    var sb = new StringBuilder();

    sb.Append("ITServer.Technology.PartialSerial");

    if (sortByPartialAsc == false) sb.Append(" DESC");

    return query.OrderBy(sb.ToString());
}

根据视图模型生成排序参数的方式,此方法可能需要进行一些调整,但您应该明白这一点。

如果您感兴趣,我一直在保持Dynamic Linq的最新状态。 https://github.com/NArnott/System.Linq.Dynamic