【问题标题】:Dynamic switch statement foreach [duplicate]foreach 的动态 switch 语句 [重复]
【发布时间】:2018-03-13 11:38:16
【问题描述】:

我这周刚开始学习带有 EF Core 的 ASP.Net Core 2.0 和使用 C# 的 MVC。所以我是一个完整的菜鸟。

它们是一种使用从模型/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());
}

【问题讨论】:

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


【解决方案1】:

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

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

sortOrder 需要与您要排序的属性的名称完全匹配(“CreatedDate”,而不是“Date”)。

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

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

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

    ...
}

你可以调用这个传递(s =&gt; s.Environment, ...

【讨论】:

  • 这将导致排序发生在客户端应用程序而不是数据库中...
  • 或者更有可能这只会抛出错误
  • 两者都是正确的。需要异常处理!
  • 不,我的意思是如果TicketsIQueryable,使用类似 EF Core 的东西,它会传递给提供者,当试图弄清楚该怎么做时会爆炸。因此,除非您强制在客户端上进行订购,否则您的提议是不可能的。
  • 使用 EF 执行此操作的唯一方法是手动创建一个 Expression,尽管我确信该站点上的某个地方会有一个骗子,但这非常复杂。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-22
  • 1970-01-01
相关资源
最近更新 更多