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



我有一个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);
    }

虽然,最终我建议研究类似谓词构建器的东西。

相关内容

  • 没有找到相关文章

最新更新