用值中的逗号搜索

时间:2018-07-20 16:21:50

标签: c# asp.net-mvc-5 asp.net-mvc-views

我进行了搜索,用户输入了一个字符串。例如,“ Smith,George”以在数据库中搜索名称。此名称在数据库中的格式为“ LastName”和“ FirstName”,因此记录如下所示:“ Smith”“ George”。

在模型中,我串联了“姓氏”和“名字”字段,以便它们像“ Smith,George”这样出现在视图中

我需要做的是解析逗号并分别搜索姓氏和名字字段。

这是我拥有的控制器代码。当仅输入两个字段中的一个或另一个时,它不会完成搜索。

        [HttpGet]
    public ActionResult Index()
    {
        return View(_db.Owners.ToList());
    }

    [HttpPost]
    public ActionResult Index(string searchString)
    {
        var owners = from o in _db.Owners select o;

        if (!String.IsNullOrEmpty(searchString))
        {
            owners = owners.Where(o => o.LastName.Contains(searchString) || o.FirstName.Contains(searchString));
        }

        return View(owners);
    }

2 个答案:

答案 0 :(得分:1)

我强烈建议您阅读以下经典文章:https://www.kalzumeus.com/2010/06/17/falsehoods-programmers-believe-about-names/

您串联的"{Last}, {First}"字符串是视图级别的问题,不应在数据库代码中执行。您的数据库和内部模型对象应以某种规范格式(例如,可能具有单独的字段(但所有字段都应为可选字段)存储人的姓名)的标题,第一,中间,最后,后缀以及您的其他任何适当的文化习俗地区或业务领域的需求。

然后使用支持某种基于字段的搜索语法的单个搜索框,以允许用户通过自由文本搜索找到用户,如果知道他们正在用“ John”寻找某人,也可以通过精确字段来查找人作为他们的姓氏,而不是“ Johnson”作为姓氏。

也不要忘记分词。我推荐这样的东西:

  1. 给出String input = "O'Brien firstname:John";
  2. 过滤掉非单词字符(标点符号等)。规范化值(例如O'Brien-> OBrien),也许也规范化为SOUNDEX(SQL Server具有内置的SOUNDEX支持:https://docs.microsoft.com/en-us/sql/t-sql/functions/soundex-transact-sql?view=sql-server-2017
  3. 分为术语:[ any: "OBrien", firstname: "John" ](为此可以使用一个简单的正则表达式)
  4. 为每个术语构建一个Linq查询(即添加新的.Where表达式,请注意,串联.Where等效于AND运算符。如果要使用多个{{1} }作为.Where操作,您将需要OR,请参见此处:How to dynamically add OR operator to WHERE clause in LINQ

类似的东西:

PredicateBuilder

答案 1 :(得分:0)

min(m, n)