2012-01-05 97 views
1

我有一種方法,通過我可以在數據庫中搜索特定客戶。目前它只需要1個學期,但我希望能夠搜索多個條款(例如客戶的帳號和他們的名字)。下面是我的方法:ASP.NET MVC 3 - 多條款搜索

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查詢應該如何條款超過一個。任何幫助,將不勝感激

+0

「帳號和他們的名字」......但是如果你有一個帳號,搜索名字有什麼意義,'accountId'應該指向那個名字,爲什麼寫它?也許你想要通過賬號**或**賬戶名?你正在努力完成什麼? – balexandre 2012-01-05 08:20:05

回答

2

既然你不知道什麼將進入或者這將是多久,我建議做以下幾點:

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; 
} 
  • 任何匹配=扔掉所有列表在一起,然後採取不同的人。
  • 完整匹配=您必須檢查所有客戶列表中出現的項目。
+0

+1,非常好的答案 – 2012-01-05 08:24:14

+0

感謝您的回覆,這非常接近。但是,如果我搜索一個名稱爲bob並且帳號爲123的客戶,則會出現問題,它將返回名稱爲bob或帳號爲123的所有客戶,而不僅僅是具有該帳戶的客戶號碼123和名字bob。 – CallumVass 2012-01-05 08:35:41

+0

實際上,它會向您返回一個名單,帳戶或郵編包含123的所有客戶列表,以及其名稱,帳戶或郵編包含bob的客戶列表。如果在兩個列表中都提到了特定項目,則帳戶,名稱或ZIP都會匹配'bob'和'123'。當然,它可能是'Android123'的帳號'BOBOBOB',但它仍然是一個有效的查詢,因爲您不知道用戶是否在查詢帳戶,名稱或郵編。 – Flater 2012-01-05 08:48:45

0

它會正常工作。我在我的項目中使用類似的查詢類型,它似乎很好。以下是代碼片段

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

順便說一句,它也運行在一個活的服務器上。

+0

是的,這個工作正常,當輸入1個搜索詞。但是,如果我輸入了一個賬號後跟一個客戶名稱,它會返回0結果 – CallumVass 2012-01-05 08:13:01

+0

正確的....那是因爲你的id和你的名字都不會包含這樣的'112234 alan'。在這種情況下,您需要做的是爲搜索字詞創建令牌變量,然後根據ID和名稱檢查它們 – 2012-01-05 08:22:21

0

可以動態attach儘可能多的條件,如你所願,以下列方式:

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

等。您可以完全控制標準:只要確保它能夠解析爲續集查詢。