我有一个MVC5视图,我使用网格。MVC组件(https://gridmvc.codeplex.com/)。这使我能够轻松地显示来自Oracle DB的数据,并具有用于排序/过滤每个数据列的开箱即用功能。我现在要实现的是一个通配符搜索在我的网格中的所有字段。例如,如果我搜索数字"2",我希望返回包含"2"的所有记录,无论是字符串、小数还是日期时间。
此网格上的过滤功能部分地通过修改URL (http://homeURL/?grid-filter=Location.DEPT__1__accounting)执行过滤(针对单个列),例如1是Equals
, 2是Contains
, 3是StartsWith
, 4是EndsWith
,然后在接下来的2下划线之后是搜索条件。
我首先想到的是,使用JavaScript通过菊花链将所有字段与使用CONTAINS的搜索条件修改为所需的URL,这是正确的路径。然后我注意到decimal
字段,如[Cost]和DateTime
(Oracle DB)字段,如[Acquired_Date]有Equals, Greater Than, and Less Than
的标准设置,所以我尝试:
$('#SearchIcon').on("click", function (e) {
window.location = window.location.href.substr(0, window.location.href.indexOf('?'));
window.location = "?grid-filter=FIELD1__2__" + document.getElementById("Search").value +
"&grid-filter=FIELD2__2__" + document.getElementById("Search").value +
"&grid-filter=COST__1__" + document.getElementById("Search").value +
// etc. -- ALL FIELDS
"&grid-filter=NOTE__2__" + document.getElementById("Search").value;
});
这在技术上起作用,但[&]
是在每个字段中搜索具有相应搜索条件的记录。我需要的是类似的东西,但有一个或[||]
条件----不幸的是,网格组件不包含这种形式的功能。
然后我认为将搜索条件传递给控制器操作,并通过multi-WHERE子句使用它,并仅返回适合过滤器的记录到我的视图:
public ActionResult SearchAssets(string searchCriteria)
{
fillPagingIntervalList();
var assetSearchResults = db.ENTITY_COLLECTION.Where(m => m.ID.ToString() == searchCriteria ||
m.Model.ToString() == searchCriteria ||
m.COST.ToString() == searchCriteria ||
// etc. -- ALL FIELDS
).FirstOrDefault();
var assetCount = db.ENTITY_COLLECTION.ToList().Count();
return View(assetSearchResults);
}
这会导致WHERE语句出错,表示查看Inner Exception
的详细信息——ORA-12704: character set mismatch MVC
。然后我将我的多个条件减少到只有2个字段来搜索调试:
var assetSearchResults = db.ENTITY_COLLECTION.Where(m => m.ID.ToString() == searchCriteria ||
m.Model.ToString() == searchCriteria).FirstOrDefault();
导致:用户代码未处理EntityCommandExecutionException。
An exception of type 'System.Data.Entity.Core.EntityCommandExecutionException' occurred in EntityFramework.dll but was not handled in user code
Additional information: An error occurred while executing the command definition. See the inner exception for details.
Inner Exception: ORA-00932: inconsistent datatypes: expected - got NCLOB
有谁知道如何得到我想要的工作吗?我也尝试了.Where(...con1...).Where(...con2...).Where(...etc...)
与相同的错误结果。我认为跨所有字段的通配符搜索很难实现,但事实证明这比我预期的要大得多。
这将非常慢,但是试试这个,它将加载整个集合到对象中,并让LINQ在客户端进行过滤:
public ActionResult SearchAssets(string searchCriteria)
{
fillPagingIntervalList();
var assetSearchResults = db.ENTITY_COLLECTION.ToList().Where(m => m.ID.ToString() == searchCriteria ||
m.Model.ToString() == searchCriteria ||
m.COST.ToString() == searchCriteria ||
// etc. -- ALL FIELDS
).FirstOrDefault();
var assetCount = db.ENTITY_COLLECTION.ToList().Count();
return View(assetSearchResults);
}
你可以试试这样做:
public ActionResult SearchAssets(string searchCriteria)
{
fillPagingIntervalList();
var assetSearchResults = db.ENTITY_COLLECTION.Where(m => m.ID.ToString() == searchCriteria)
.Union(db.ENTITY_COLLECTION.Where(m =>m.Model.ToString()==searchCriteria))
.Union(db.ENTITY_COLLECTION.Where(m =>m.COST.ToString() == searchCriteria))
// etc. -- ALL FIELDS
var assetCount = db.ENTITY_COLLECTION.ToList().Count();
return View(assetSearchResults);
}
虽然,最终我建议研究类似谓词构建器的东西。