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的动态链接查询提到。我最后主要走这条路。。。结果证明它相当优雅和有用。我对每个模型都有一个单独的实现,但它确实不错。非常感谢!我最后主要走这条路。。。结果证明它相当优雅和有用。我对每个模型都有一个单独的实现,但它确实不错。非常感谢!