ASP.NET MVC-запрос с необязательным полем и значением - PullRequest
0 голосов
/ 22 апреля 2009

То, что я пытаюсь сделать, это предоставить общую возможность поиска по таблице. Таким образом, пользователю представляются все данные в таблице, они вводят некоторый текст для фильтрации, и, вуаля, таблица теперь фильтруется по всем результатам, которые соответствуют этой записи.

У меня это работает с одним полем:

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 ]

2 голосов
/ 22 апреля 2009

Единственный простой (зависит от вашего определения «простой», я думаю) способ сделать это - использовать Dynamic Linq API. Смотрите здесь:

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

1 голос
/ 22 апреля 2009

Основная причина, по которой вы не можете просто указать имя поля в качестве имени свойства вашего класса, заключается в том, что 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 > вместо куча утверждений if, но это все равно что взломать.

1 голос
/ 22 апреля 2009

Я бы сделал это с помощью оператора 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...