代码之家  ›  专栏  ›  技术社区  ›  Andrew Flanagan

带有可选字段和值的ASP.NET MVC查询

  •  0
  • Andrew Flanagan  · 技术社区  · 16 年前

    我要做的是在一个表上提供一个通用的搜索功能。所以用户在一个表中看到了所有的数据,他们输入了一些要过滤的文本,瞧,这个表现在被过滤掉了所有匹配这个条目的结果。

    我用一个字段来处理:

    public ActionResult Index(string user_name)
    {
    
        var dataContext = new PurchaseOrderDataContext();
    
        var orders = from o in dataContext.purchase_orders
                     where o.approved_by.display_name.StartsWith(user_name ?? "")
                     select o;
    
        if (Request.IsAjaxRequest())
        {
            return PartialView("list", orders);
        }
        else
        {
            return View(orders);
        }
    }
    

    但是我要寻找的是他们有一个下拉列表的能力,允许他们在他们想要过滤的领域中通过。它想要这样的东西:

    public ActionResult Index(string field, string query_value)
    {
    
        var dataContext = new PurchaseOrderDataContext();
    
        var orders = from o in dataContext.purchase_orders
                     where o["field"].StartsWith(query_value ?? "")
                     select o;
    
        if (Request.IsAjaxRequest())
        {
            return PartialView("list", orders);
        }
        else
        {
            return View(orders);
        }
    }
    

    …除了 o["field"] 只是我对语法的愚蠢猜测(这行不通)。

    我想我只是有点困惑,因为虽然我使用了这个很好的类化数据模型,但有时我想按名称显式地引用列。

    我该怎么做呢?

    如果这很明显,我很抱歉…

    编辑: 我想我现在就把这个打开看看是否有一个比下面建议的更整洁,更少黑客的感觉解决方案。谢谢!

    3 回复  |  直到 16 年前
        1
  •  2
  •   BFree    16 年前

    唯一简单的方法(取决于“简单”的定义,我猜)是使用动态LinqAPI。请参见此处:

    http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

        2
  •  1
  •   Keltex    16 年前

    我这样做的方法是使用switch语句:

    var orders = dataContext.purchase_orders;
    
    if(!string.IsNullOrEmpty(query_value))
    {
        switch(field)
        {
            case "firstname":
                orders = orders.Where(x => x.FirstName.StartsWith(query_value));
                return;
            case "company":
                orders = orders.Where(x => x.Company.StartsWith(query_value));
                return;
            // etc.
        }
    }
    

    这还允许您验证 field .

        3
  •  1
  •   Min    16 年前

    之所以不能将字段名作为类的属性名,主要是因为Linq构建了一个表达式树。

    现在你能做的就是通过做来划分你是如何构建你的表达式树的。

    var orders = from o in dataContext.purchase_orders
                     select o;
    
    if (!string.IsNullOrEmpty(user_name)) {
         orders = orders.Where(x => x.StartsWith(user_name);
    }
    

    只需添加更多的if语句…呃…是的,它绝对不漂亮,有人可能通过制作IDictionary<string、func<expression、string>,而不是一堆if语句使它看起来更好,但它仍然像一个黑客。