我有一个MVC5视图,我在哪里使用Grid.MVC组件(https://gridmvc.codeplex.com/)。这使我可以轻松地显示来自Oracle DB的数据,并具有用于排序/过滤每个数据列的开箱即用功能。我现在想要实现的是在网格中的所有字段中进行通配符搜索。例如,如果我搜索数字" 2"我想返回包含" 2"的所有记录。是字符串,小数或日期时间。
此网格上的过滤器功能部分通过修改网址(http://homeURL/?grid-filter=Location.DEPT__1__accounting)执行过滤(针对各个列),例如1为Equals
,2为Contains
,3为{{ 1}},4为StartsWith
,然后在接下来的2个下划线为搜索条件之后。
我首先想到的是,我正在沿着正确的道路前进,使用JavaScript通过使用CONTAINS使用搜索条件对所有字段进行菊花链连接来修改所需的URL。然后我注意到[{1}}字段,如[Cost]和EndsWith
(Oracle DB)字段,如[Acquired_Date],其标准设置为decimal
,所以我尝试了:
DateTime
这在技术上起作用,但Equals, Greater Than, and Less Than
正在搜索在每个字段中具有相应搜索条件的记录。我需要的是类似的东西,但是使用OR $('#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子句使用它并仅将适合过滤器的记录返回到我的视图:
[&]
这导致WHERE cluase出错,说明要查看[||]
详细信息 - 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);
}
。然后我将我的多个条件减少到只有2个字段来搜索调试:
Inner Exception
导致: EntityCommandExecutionException未被用户代码处理。
ORA-12704: character set mismatch MVC
任何人都知道如何获得我想要的工作?我也尝试了var assetSearchResults = db.ENTITY_COLLECTION.Where(m => m.ID.ToString() == searchCriteria ||
m.Model.ToString() == searchCriteria).FirstOrDefault();
并导致相同的错误。我认为在所有领域进行通配符搜索很难实现,但事实证明这是一个比我预期的更大的动物。
答案 0 :(得分:1)
这将非常慢,但尝试这个,它会将整个集合加载到对象中,让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);
}
虽然,最终我建议调查类似谓词构建器的东西。无论如何,似乎是你在做什么。