C# 动态模型排序

C# 动态模型排序,c#,asp.net-mvc,entity-framework,asp.net-mvc-4,C#,Asp.net Mvc,Entity Framework,Asp.net Mvc 4,所以不可否认,我是MVC的新手,在这方面我有很多困难 我的DB表由Entry Repository实例化到Entry Controller中的实体框架。我可以提取数据,我的分页助手似乎正在运行。我甚至可以过滤结果。但是我花了很长时间才弄清楚如何对列进行排序 从控制器: public ViewResult Entries(string Specialty, string sortOrder, string CurrentSort, int page = 1) { //

所以不可否认,我是MVC的新手,在这方面我有很多困难

我的DB表由Entry Repository实例化到Entry Controller中的实体框架。我可以提取数据,我的分页助手似乎正在运行。我甚至可以过滤结果。但是我花了很长时间才弄清楚如何对列进行排序

从控制器:

   public ViewResult Entries(string Specialty, string sortOrder, string CurrentSort, int page = 1)
    {
        //ViewBag.CurrentSort = sortOrder;

        //sortOrder = String.IsNullOrEmpty(sortOrder) ? "TimeStamp" : sortOrder;

        //for testing
        sortOrder = "Case";

        switch (sortOrder)
        {
            case "Case":
                sortOrder = "p.Case";
                break;

            case "Timestamp":
                sortOrder = "p.TimeStamp";
                break;

            case "Origin":
                sortOrder = "Origin";
                break;

            case "AssignedTo":
                sortOrder = "AssignedTo";
                break;

            case "AssignedBy":
                sortOrder = "AssignedBy";
                break;
        }

        EntryListViewModel model = new EntryListViewModel
        {
            Entry = repository.Entries.AsQueryable()
            .Where(p => Specialty == null || p.Sub == Specialty)
            .OrderBy(p => sortOrder)
            .Skip((page - 1) * pagesize)
            .Take(pagesize),
            PagingInfo = new PagingInfo
            {
                CurrentPage = page,
                ItemsPerPage = pagesize,
                TotalItems = Specialty == null ?
                repository.Entries.Count() :
                repository.Entries.Where(p => p.Sub == Specialty).Count()
            },

            CurrentCategory = Specialty
        };


        return View(model);
    }
    public ViewResult Entries(string Specialty, string sortOrder, int page = 1)
    {
        //ViewBag.CurrentSort = sortOrder;

        //sortOrder = String.IsNullOrEmpty(sortOrder) ? "TimeStamp" : sortOrder;

        var Query = repository.Entries
            .Where(p => Specialty == null || p.Sub == Specialty);

        switch (sortOrder)
        {
            default:
                Query = Query.OrderByDescending(p => p.TimeStamp);
                break;

            case "Case":
                Query = Query.OrderBy(p => p.Case);
                break;

            case "Timestamp":
                Query = Query.OrderBy(p => p.TimeStamp);
                break;

            case "Origin":
                Query = Query.OrderBy(p => p.Origin);
                break;

            case "AssignedTo":
                Query = Query.OrderBy(p => p.AssignedTo);
                break;

            case "AssignedBy":
                Query = Query.OrderBy(p => p.AssignedBy);
                break;
        }

        EntryListViewModel model = new EntryListViewModel
        {
            Entry = Query
            //.Where(p => Specialty == null || p.Sub == Specialty)
            //.OrderBy(p => sortOrder)
            .Skip((page - 1) * pagesize)
            .Take(pagesize),
            PagingInfo = new PagingInfo
            {
                CurrentPage = page,
                ItemsPerPage = pagesize,
                TotalItems = Specialty == null ?
                    Query.Count() :
                    Query.Where(p => p.Sub == Specialty).Count()
            },
            _SortOrder = sortOrder,
            _CurrentCategory = Specialty
        };


        return View(model);
    }
从这个角度来看:

@model ProjectSquid.WebUI.Models.EntryListViewModel


<table class="entries">
    <thead>
        <tr>
            <th>@Html.ActionLink("Case Number", "Entries", "Entry", new {Specialty = Model.CurrentCategory, sortOrder = "Case", CurrentSort = ViewBag.CurrentSort}) </th>
            <th>Time Stamp </th>
            <th>Origin </th>
            <th>Assigned To </th>
            <th>Assigned By </th>
            <th>Customer Name </th>
            <th>Customer Phone </th>
            <th>Comments </th>
        </tr>
    </thead>
    <tbody class="entry">
        @foreach (var p in Model.Entry)
        {
            <tr>
                <td title="@p.Case">@p.Case</td>
                <td title="@p.TimeStamp">@p.TimeStamp</td>
                <td title="@p.Origin">@p.Origin</td>
                <td title="@p.AssignedTo">@p.AssignedTo</td>
                <td title="@p.AssignedBy">@p.AssignedBy</td>
                <td title="@p.CustomerName">@p.CustomerName</td>
                <td title="@p.CustomerPhone">@p.CustomerPhone</td>
                <td title="@p.Comments">@p.Comments</td>
                @if (Context.User.Identity.IsAuthenticated){<td>Delete</td>}
            </tr>}
    </tbody>
</table>

<div class="pager">
        @Html.PageLinks(Model.PagingInfo, x => Url.Action("Entries",
        new { page = x, category = Model.CurrentCategory }))
</div>

我还必须创建一个HTML助手类来进行排序,同时维护页码。仍在工作,但现在我正在取得进展,谢谢

OrderBy函数的工作方式是,它需要一个lambda表达式来返回对象的属性,而您正试图插入一个字符串。一种方法是像这样重新构造代码:(这是未经测试的,但应该给您一个想法):

如果您认为此查询效率低下,请不要担心,由于延迟执行,在您尝试使用
ToList()具体化结果之前,数据库实际上不会是查询

 var query = repository.Entries
                       .Where(p => Specialty == null || p.Sub == Specialty);

 switch (sortOrder)
 {
    case "Case":
        query = query.OrderBy(p => p.Case);
        break;

    case "Timestamp":
        query = query.OrderBy(p => p.TimeStamp);
        break;

    case "Origin":
        query = query.OrderBy(p => p.Origin);
        break;
 **SNIP**

var Entry = query.Skip((page - 1) * pagesize)
                  .Take(pagesize)
                  .ToList() //You probably need this here