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

时间:2009-04-22 18:00:01

标签: c# .net asp.net sql linq

我要做的是在桌面上提供通用搜索功能。因此,向用户显示表格中的所有数据,他们输入一些文本进行过滤,然后,表格现在将对与该条目匹配的所有结果进行过滤。

我使用单个字段:

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"]只是我对语法的愚蠢猜测(这不起作用)。

我想我只是感到困惑,因为虽然我正在使用这个很好的类ified数据模型,但有时我想明确地按名称引用列。

我将如何做到这一点?

如果这很明显,我道歉......

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

3 个答案:

答案 0 :(得分:2)

唯一的简单(取决于您对“简单”我的定义)的方法是使用Dynamic Linq API。见这里:

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

答案 1 :(得分:1)

我这样做的方法是使用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

答案 2 :(得分:1)

您不能只将字段名称作为类的属性名称放入的主要原因是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语句,但它仍然感觉像是一个黑客。