CallumVass
CallumVass

Reputation: 11448

ASP.NET MVC 3 - Search with multiple terms

I have a method where by I'm able to search in a database for a specific customer(s). At the moment it only takes 1 term, but i'd like to be able to search with multiple terms (for example the customer's account number and their name). Below is my method:

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;
}

As you can see, i've decided to split each term entered (I assume each term will be seperated by a space) but I'm not sure how my LINQ query should be for terms longer than one. Any help would be appreciated

Upvotes: 1

Views: 4399

Answers (3)

Iurii
Iurii

Reputation: 1

You can dynamically attach as many conditions as you wish, in the following manner:

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

And so on. You have full control over the criteria : just make sure that it resolves to a sequel query.

Upvotes: 0

Flater
Flater

Reputation: 13773

Since you don't know what will be entered or how long it will be, I would suggest doing the following:

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;
}
  • Any matches = throw all lists together, then take the distinct ones.
  • Complete matches = you'll have to check for items which occur in all customerlists.

Upvotes: 2

Pankaj Upadhyay
Pankaj Upadhyay

Reputation: 13584

It will work fine. I am using a similar type of query in my project and it seems to work great. Following is the code snippet

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

BTW, its running on a live server too.

Upvotes: 0

Related Questions