【问题标题】:ASP.NET MVC 3 - Search with multiple termsASP.NET MVC 3 - 使用多个词进行搜索
【发布时间】:2012-01-05 08:06:54
【问题描述】:

我有一种方法可以在数据库中搜索特定客户。目前只需要 1 个术语,但我希望能够搜索多个术语(例如客户的帐号和他们的姓名)。下面是我的方法:

public List<AXCustomer> allCustomers(string id)
{
    string[] searchstring = id.Split(' ');
    List<AXCustomer> customer = new List<AXCustomer>();

    // if 3 terms are entered
    if (searchstring.Length > 2)
    {

    }
    // if 2 terms are entered
    else if (searchstring.Length > 1)
    {

    }
    // revert back to default search
    else
    {
        customer = context.AXCustomers.Where(x => x.ACCOUNTNUM.Contains(id) ||
                   x.NAME.Contains(id) || x.ZIPCODE.Contains(id)).ToList();
    }

    return customer;
}

如您所见,我决定拆分输入的每个术语(我假设每个术语将用空格分隔),但我不确定我的 LINQ 查询应该如何处理超过一个的术语。任何帮助将不胜感激

【问题讨论】:

  • "帐号及其名称" ...但是如果您有帐号,那么搜索名称有什么意义,accountId 应该已经指向该名称,为什么要写呢?也许您想要按帐号帐户名称?这就是你想要完成的事情吗?

标签: c# linq asp.net-mvc-3


【解决方案1】:

由于您不知道将输入什么或输入多长时间,我建议您执行以下操作:

public List<AXCustomer> allCustomers(string id)
{
    string[] searchstring = id.Split(' ');
    List<List<AXCustomer>> customerlists = new List<List<AXCustomer>>();


    foreach (string word in searchstring)
    {
        customerlists.Add(context.AXCustomers.Where(x => x.ACCOUNTNUM.Contains(word) || x.NAME.Contains(word) || x.ZIPCODE.Contains(word)).ToList());
    }

    //Then you just need to see if you want ANY matches or COMPLETE matches.
    //Throw your results together in a List<AXCustomer> and return it.


    return mycombinedlist;
}
  • 任何匹配 = 将所有列表放在一起,然后取出不同的列表。
  • 完全匹配 = 您必须检查所有客户列表中出现的项目。

【讨论】:

  • 感谢回复,这个很接近了。但是有一个问题,如果我搜索一个名为 bob 且帐号为 123 的客户,它将返回所有名称为 bob 或帐号为 123 的客户,而不仅仅是拥有该帐户的客户编号 123 和名字 bob。
  • 实际上,它会返回一个名称、帐户或邮政编码包含 123 的所有客户的列表,以及一个名称、帐户或邮政编码包含 bob 的客户的列表。如果两个列表中都提到了特定项目,则帐户、名称或 ZIP 匹配“bob”和“123”。当然,它可能是帐号为“BOBOBOB”的“Android123”,但它仍然是一个有效的查询,因为您不知道用户是在查询帐户、名称还是 zip。
  • 你说得对,我想我现在已经得到了我想要的,谢谢你的帮助
【解决方案2】:

它会正常工作的。我在我的项目中使用了类似类型的查询,它似乎工作得很好。以下是代码sn -p

PagedList.IPagedList<Product> PagedProducts = dbStore.Products.Where(p => p.Name.Contains(query) || p.MetaKeywords.Contains(query)).ToList().ToPagedList(pageIndex, PageSize);

顺便说一句,它也在实时服务器上运行。

【讨论】:

  • 是的,当输入 1 个搜索词时,这可以正常工作。但是,如果我输入了一个帐号后跟一个客户名称,它将返回 0 个结果
  • 对 ....那是因为您的 id 和您的姓名 peroperty 都不会包含类似 112234 alan 的内容。在这种情况下,您需要做的是为搜索词创建标记变量,然后根据 id 和 name 检查它们
【解决方案3】:

您可以通过以下方式动态地attach 任意多个条件:

customer = context.AXCustomers.Where(x => x.ACCOUNTNUM.Contains(id));
customer = customer.Where(Condition 2);
customer = customer.Where(Condition 3); 

等等。您可以完全控制条件:只要确保它解析为后续查询即可。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多