簡體   English   中英

具有可選字段和值的ASP.NET MVC查詢

[英]ASP.NET MVC query with optional field and value

我正在嘗試做的是在表上提供通用搜索功能。 因此,向用戶顯示了表中的所有數據,他們輸入了一些要過濾的文本,瞧,現在,表在所有與該條目匹配的結果上進行了過濾。

我有一個單一領域的工作:

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"]只是我對語法的愚蠢猜測(無效)。

我想我只是感到困惑,因為盡管我使用的是這種很好的分類數據模型,但有時我還是想按名稱顯式地引用列。

我將如何去做呢?

如果這很明顯,我表示歉意...

編輯:我想我現在暫時不公開此內容,以查看是否有一種比下面建議的更整潔,更不合算的感覺解決方案。 謝謝!

做到這一點的唯一簡單方法(取決於我對“簡單”的定義)將使用Dynamic Linq API。 看這里:

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

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

之所以不能只將字段名稱作為類的屬性名稱,是因為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來使它看起來更好。聲明,但仍然感覺像是駭客。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM