【发布时间】:2015-06-09 00:07:17
【问题描述】:
我有一个 MVC5 视图,我在其中使用 Grid.MVC 组件 (https://gridmvc.codeplex.com/)。这使我可以轻松地显示来自我的 Oracle 数据库的数据,并且具有用于对每个数据列进行排序/过滤的开箱即用功能。我现在要实现的是跨网格中所有字段的通配符搜索。例如,如果我搜索数字“2”,我想返回所有包含“2”的记录,无论它们是字符串、十进制还是日期时间。
此网格上的过滤功能通过修改 URL (http://homeURL/?grid-filter=Location.DEPT__1__accounting) 部分执行过滤(针对单个列),例如 1 是 Equals,2 是 Contains,3 是 StartsWith,4 是 @ 987654326@ 然后在接下来的 2 个下划线之后是搜索条件。
我首先认为我正在走正确的道路,使用 JavaScript 修改为所需的 URL,方法是使用 CONTAINS 将所有字段与搜索条件进行菊花链。然后我注意到像 [Cost] 和 DateTime (Oracle DB) 像 [Acquired_Date] 这样的 decimal 字段的标准设置为 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;
});
这在技术上起作用,但 [&] 正在搜索在每个字段中具有相应搜索条件的记录。我需要的是类似的东西,但带有 OR [||] 条件----不幸的是,网格组件不包含这种形式的功能。
然后我想将搜索条件传递给控制器操作并通过 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...),但结果相同。我认为跨所有领域的通配符搜索很难实现,但事实证明这比我预期的要大。
【问题讨论】:
-
Oracle 的实施看起来很糟糕。您的查询看起来可以在 SQL Server 上正常运行。
标签: asp.net-mvc oracle linq entity-framework asp.net-mvc-5