在MVC中对所有(显示的)模型字段执行通配符搜索?

时间:2015-06-08 15:36:26

标签: asp.net-mvc oracle linq entity-framework asp.net-mvc-5

我有一个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(); 并导致相同的错误。我认为在所有领域进行通配符搜索很难实现,但事实证明这是一个比我预期的更大的动物。

1 个答案:

答案 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);
    }

虽然,最终我建议调查类似谓词构建器的东西。无论如何,似乎是你在做什么。