Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具有可选字段和值的ASP.NET MVC查询_C#_.net_Asp.net_Sql_Linq - Fatal编程技术网

C# 具有可选字段和值的ASP.NET MVC查询

C# 具有可选字段和值的ASP.NET MVC查询,c#,.net,asp.net,sql,linq,C#,.net,Asp.net,Sql,Linq,我想做的是在表上提供一个通用的搜索功能。因此,用户将看到一个表中的所有数据,他们输入一些要过滤的文本,瞧,该表现在将根据与该项匹配的所有结果进行过滤 我用一个字段来处理这个问题: public ActionResult Index(string user_name) { var dataContext = new PurchaseOrderDataContext(); var orders = from o in dataContext.purchase_orders

我想做的是在表上提供一个通用的搜索功能。因此,用户将看到一个表中的所有数据,他们输入一些要过滤的文本,瞧,该表现在将根据与该项匹配的所有结果进行过滤

我用一个字段来处理这个问题:

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”]
只是我对语法的愚蠢猜测(这是行不通的)

我想我只是感到困惑,因为尽管我使用的是这个很好的类化数据模型,但有时我希望通过名称显式地引用列

我该怎么做呢

如果这是显而易见的,我很抱歉


编辑:我想暂时不讨论这个问题,看看是否有一个比下面建议的更整洁、更少黑客感的解决方案。谢谢

我的方法是使用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.
    }
}

这还允许您验证
字段

,方法是使用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.
    }
}

这还允许您验证
字段

不能将字段名作为类的属性名输入的主要原因是因为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语句来让它看起来更好,但它仍然感觉像是一个黑客。

不能将字段名作为类的属性名,主要原因是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语句来让它看起来更好,但它仍然感觉像是一个黑客。

唯一简单的方法(我想这取决于你对“简单”的定义)是使用动态LINQAPI。请看这里:

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


我希望你不要这么说。。。多痛苦啊。谢谢你!你知道吗,我想了一下。我找到了这篇文章。如果你有什么想法告诉我们我希望你不要这么说。。。多痛苦啊。谢谢你!你知道吗,我想了一下。我找到了这篇文章。如果你有什么想法,告诉我们。这么多工作…:-)我很懒。我希望有一个可重用的例程,因为我正是以这种方式处理很多表,并且讨厌重复将字符串映射到同名数据列的代码。我是否错误地认为有一些jQuery插件在客户端提供了此功能?您可以使用BFree的动态链接查询提到。这么多工作…:-)我很懒。我希望有一个可重用的例程,因为我正是以这种方式处理很多表,并且讨厌重复将字符串映射到同名数据列的代码。我是否错误地认为有一些jQuery插件在客户端提供了此功能?您可以使用BFree的动态链接查询提到。我最后主要走这条路。。。结果证明它相当优雅和有用。我对每个模型都有一个单独的实现,但它确实不错。非常感谢!我最后主要走这条路。。。结果证明它相当优雅和有用。我对每个模型都有一个单独的实现,但它确实不错。非常感谢!