动态切换语句foreach

时间:2018-03-13 11:38:17

标签: c# asp.net-mvc foreach switch-statement asp.net-core-2.0

我本周刚刚开始使用C#学习使用EF Core和MVC的ASP.Net核心2.0。所以我是一个完整的Noob。

它们是使用从Model / restful API中提取的动态参数创建动态Switch(SortOrder)的方法吗?这是我的Switch语句最终不会超过30个案例。

我正在寻找这个Sudo线上的东西:

switch (sortOrder)
{
    default:
        Tickets = Tickets.OrderBy(s => s.ID);
        break;
    foreach (string Tick in Tickets)
        {
        case Tick :
           Tickets = Tickets.OrderBy(T => Tick);
           break;
 }

用于我的TicketController的参考部分

public async Task<IActionResult> Index(string sortOrder, string searchString)
{
    //sorting
    ViewData["NameSortParm"] = String.IsNullOrEmpty(sortOrder) ? "ID" : "";
    ViewData["DateSortParm"] = sortOrder == "ID" ? "Environment" : "Date";
    ViewData["CurrentFilter"] = searchString;

    var Tickets = from s in _context.MyTickets
                   select s;
    // search
    if (!String.IsNullOrEmpty(searchString))
    {
        Tickets = Tickets.Where(T => T.ID.ToString().Contains(searchString)
                               || T.Environment.Contains(searchString)
                               || T.YourRef.Contains(searchString)
                               || T.Priority.Contains(searchString)
                               || T.Type.Contains(searchString)
                               || T.ProductName.Contains(searchString)
                               || T.Environment.Contains(searchString)
                               || T.Version.Contains(searchString)
                               || T.Description.Contains(searchString)
                               || T.Status.Contains(searchString)
                               || T.Contact.Contains(searchString));
    }
    ////sorting
    //switch (sortOrder)
    //{
    //    case "ID":
    //        Tickets = Tickets.OrderByDescending(s => s.ID);
    //        break;
    //    case "Date":
    //        Tickets = Tickets.OrderBy(s => s.CreatedDate);
    //        break;
    //    case "Environment":
    //        Tickets = Tickets.OrderBy(s => s.Environment);
    //        break;
    //    default:
    //        Tickets = Tickets.OrderBy(s => s.ID);
    //        break;
    //}

    switch (sortOrder)
    {
        default:
            Tickets = Tickets.OrderBy(s => s.ID);
            break;
        foreach (string Tick in Tickets)
            {
                case Col :
            Tickets = Tickets.OrderBy(T => Col)
       }


    }


    // return results
    return View(await Tickets.AsNoTracking().ToListAsync());
}

1 个答案:

答案 0 :(得分:0)

这将使用反射按与sortOrder字符串匹配的属性进行排序:

    Tickets = Tickets.OrderBy(s => s.GetProperty(sortOrder).GetValue(s));

sortOrder需要与您要排序的属性的名称完全匹配(&#34; CreatedDate&#34;,not&#34; Date&#34;)。

或者,您可以更改方法签名以接受函数而不是sortOrder的字符串:

public async Task<IActionResult> Index(Func<Ticket, object> sortOrder, string searchString)
{
    ...

    Tickets = Tickets.OrderBy(s => sortOrder(s));

    ...
}

你可以称之为(s => s.Environment, ...