Linq MVC3 where子句中的动态签入数
在我看来,我有一个多重选择,其中包含一些服务器名称列表。服务器的数量将是动态的,并且变化非常频繁Linq MVC3 where子句中的动态签入数,linq,asp.net-mvc-3,multiple-conditions,Linq,Asp.net Mvc 3,Multiple Conditions,在我看来,我有一个多重选择,其中包含一些服务器名称列表。服务器的数量将是动态的,并且变化非常频繁 <select name="servers" class="selectpicker" multiple data-live-search="true"> <optgroup label="Prod5"> <option>VS12</option> <option>...</option>
<select name="servers" class="selectpicker" multiple data-live-search="true">
<optgroup label="Prod5">
<option>VS12</option>
<option>...</option>
</optgroup>
<optgroup label="UAT6">
<option>VS13</option>
<option>...</option>
</optgroup>
</select>
VS12
...
VS13
...
在控制器中,我需要根据一些静态的KPIKey数和服务器名称(kpi.KPIserver)对数据库进行过滤,这些名称将由用户从多个select中选择。如何在下面的where子句中添加动态数量的KPIserver检查,例如
其中kpi.KPIkey==“CPU使用率”| kpi.KPIkey==“I/O操作”&kpi.KPIserver==“VS12”| kpi.KPIserver==“VS13”| kpi.KPIserver==
[HttpPost]
public ActionResult Index(FormCollection fs)
{
IEnumerable<kpi_master> allKPI = null;
try
{
allKPI = from kpi in db.kpi_masters
where kpi.KPIkey == "CPU usage" || kpi.KPIkey == "I/O operations"
select kpi;
}
catch (Exception e) { log.Error("KPI POST error: " + e.Message); }
return View(allKPI);
}
[HttpPost]
公共行动结果索引(FormCollection fs)
{
IEnumerable allKPI=null;
尝试
{
allKPI=来自db.kpi\u masters中的kpi
其中kpi.KPIkey==“CPU使用率”| kpi.KPIkey==“I/O操作”
选择关键绩效指标;
}
捕获(异常e){log.Error(“KPI POST错误:+e.Message);}
返回视图(所有KPI);
}
如果要检查的字段数设置好了,那么就很容易了
var keys = new List<string>() { "CPU usage", "I/O operations" };
var servers = new List<string>() { "VS13", "SERVERX" };
.....
allKPI = allKPI = from kpi in db.kpi_masters
where keys.Contains(kpi.KPIkey) || servers.Contains(kpi.KPIserver)
select kpi;
var keys=newlist(){“CPU使用”、“I/O操作”};
var servers=newlist(){“VS13”,“SERVERX”};
.....
allKPI=allKPI=来自db.kpi\u masters中的kpi
其中keys.Contains(kpi.KPIkey)| | servers.Contains(kpi.KPIserver)
选择关键绩效指标;
如果子句的数量是动态的,则使用linq扩展方法。
然后像
var result = collection. Where (o => contional clause 1);
foreach (var extraclause in dynamicClauses)
{
result = result.Where (o => extraclause (o));
}
因此,您可以动态添加子句,并且查询将仅在枚举集合(结果)时执行。如果要立即强制执行,请添加
var final = result.ToArray ();
谢谢你,埃里克。这就是我需要的。