C# ASP.NET MVC 3-使用多个术语进行搜索

C# ASP.NET MVC 3-使用多个术语进行搜索,c#,linq,asp.net-mvc-3,C#,Linq,Asp.net Mvc 3,我有一种方法,可以在数据库中搜索特定客户。目前只需要一个术语,但我希望能够使用多个术语(例如客户的帐号和姓名)进行搜索。以下是我的方法: public List<AXCustomer> allCustomers(string id) { string[] searchstring = id.Split(' '); List<AXCustomer> customer = new List<AXCustomer>(); // if 3 t

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

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;
}
公开列出所有客户(字符串id)
{
string[]searchstring=id.Split(“”);
列表客户=新列表();
//如果输入3个术语
如果(searchstring.Length>2)
{
}
//如果输入了两个术语
else if(searchstring.Length>1)
{
}
//恢复为默认搜索
其他的
{
customer=context.AXCustomers.Where(x=>x.ACCOUNTNUM.Contains(id)||
x、 NAME.Contains(id)| | x.ZIPCODE.Contains(id)).ToList();
}
退货客户;
}

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

很好。我在我的项目中使用了类似类型的查询,它似乎工作得很好。下面是代码片段

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

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

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

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;
}
公开列出所有客户(字符串id)
{
string[]searchstring=id.Split(“”);
List CustomerList=新列表();
foreach(搜索字符串中的字符串字)
{
添加(context.AXCustomers.Where(x=>x.ACCOUNTNUM.Contains(word)| | x.NAME.Contains(word)| | x.ZIPCODE.Contains(word)).ToList();
}
//然后,您只需要查看是否需要任何匹配或完整匹配。
//将结果放在一个列表中并返回。
返回mycombinedlist;
}
  • Any matches=将所有列表放在一起,然后选择不同的列表
  • Complete matches=您必须检查所有CustomerList中出现的项目

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

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

等等。您可以完全控制条件:只需确保它解析为一个续集查询。

是的,当输入一个搜索词时,这可以正常工作。但是,如果,假设我输入了一个帐号,后跟一个客户名称,它将返回0 resultsright…这是因为您的id和您的姓名peroperty都不会包含这样的内容
112234 alan
。在这种情况下,您需要做的是为搜索项创建令牌变量,然后根据id和名称“帐号及其名称”检查它们。。。但是如果你有一个帐号,那么搜索一个名字有什么意义呢,
accountId
应该已经指向这个名字了,为什么要写它呢?也许你想按帐号或帐户名?这就是你想要完成的吗?谢谢你的回复,这很接近。但有一个问题,如果我搜索一个名为bob、账号为123的客户,它将返回所有名为bob或账号为123的客户,而不仅仅是名为bob、账号为123的客户。实际上,它将返回所有名为,account或zipcode包含123,以及名称、account或zipcode包含bob的客户列表。如果两个列表中都提到了特定项目,则帐户、名称或邮政编码都与“bob”和“123”匹配。当然,它可以是帐户号为“BOBOBOB”的“Android123”,但它仍然是一个有效的查询,因为您不知道用户是在查询帐户、名称还是邮政编码。您是对的,我想我现在已经得到了我想要的,谢谢您的帮助