2012-01-05 11 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クエリはどうあるべきかわからないんだけど1よりも長い期間。任意の助けをいただければ幸いです

+0

「アカウント番号とその名前」...アカウント番号がある場合、名前を検索するポイントは何ですか?「accountId」はその名前を既に指しているはずです。たぶんあなたはアカウント番号で**または**アカウント名で欲しいですか?それはあなたが達成しようとしていることですか? – balexandre

答えて

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、非常に良い答え –

+0

返事ありがとう、これは非常に近いです。しかし問題があります。もし私が名前がボブであり、アカウント番号が123である顧客を検索すると、ボブかアカウント番号が123の顧客を返します。 123番と名前のボブ。 – CallumVass

+0

実際には、名前、アカウント、または郵便番号に123が含まれるすべての顧客のリスト、名前、アカウント、または郵便番号にbobが含まれている顧客のリストが返されます。特定のアイテムが両方のリストに記載されている場合、アカウント、名前、またはZIPは「bob」と「123」の両方に一致します。アカウントナンバーが「BOBOBOB」の「Android123」でもかまいませんが、ユーザーがアカウント、名前、またはzipを照会しているかどうかわからない場合でも有効なクエリです。 – Flater

0

それは正常に動作します。私は自分のプロジェクトで同様のタイプのクエリを使用していますが、うまくいくようです。以下はコードスニペットです

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

BTWはライブサーバーでも実行されています。

+0

はい、1つの検索語を入力するとうまくいきます。しかし、顧客名の後に口座番号を入力すると、0の結果が返されます – CallumVass

+0

これは、あなたのIDもあなたの名前のperopertyもこの '112234 alan'のようなものを含んでいないからです。そのような場合は、検索用語のトークン変数を作成し、IDと名前を確認してください。 –

0

することはでき動的attachなど多くの条件あなたが望むように、次のように:

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

のように。あなたは基準を完全にコントロールできます:それが続編クエリに解決されることを確認してください。

関連する問題