2017-10-26 89 views
1

私はLiteDBに新規で、複数のクエリを一度に実行したいと考えています。LiteDB複数のクエリをC#で

私のデータベースで特定の顧客を検索できるようにしたいと思います。同様の名前の顧客が複数存在するため、すべてを返信して降順(Idまたは日付)の注文に並べ替えたいと思います。私は両方の機能が即興だが分離されているので、私はに検索とソートを組み合わせることを探しています1つのクエリ。ここで

は、メインの検索機能である:ここで

private void search_btn_Click(object sender, RoutedEventArgs e) 
    { 
     using (var dataBase = new LiteDatabase(dbConnectionString)) 
     { 
      // Stranka = Customer 
      var collection = dataBase.GetCollection<Stranka>("stranka"); 
      // Search for a customer name whom I enter in the searchName_tb 
      var query = collection.Find(Query.Where("Ime_Priimek", 
      x => x.AsString.Contains(searchName_tb.Text))); 

      // Currently I'm doing everything with ListView, so I clear it 
      // to make room for resulting data to be shown 
      lvStranke.Items.Clear(); 

      foreach (var customer in query) 
      {     
       lvStranke.Items.Add(customer); 
      } 
     } 
    } 

は、彼らが/リフレッシュロードされますとき降順にソートの私のバージョンです:

public void LiteDB_ShowAll() 
    { 
     using (var dataBase = new LiteDatabase(dbConnectionString)) 
     { 
      var collection = dataBase.GetCollection<Stranka>("stranka"); 
      lvStranke.Items.Clear(); 

      var count = collection.Count(Query.All()); 
      // From last ID to first (Descending) 
      for (int i = count; i >= 1; i--) 
      { 
       lvStranke.Items.Add(collection.FindById(i)); 
      }    
     }   
    } 

答えて

0

あなたがQueries wiki pageでの例を見てきました? Findで取得したオブジェクトをLINQで並べ替えることができるようですが、これはエンジン自体ではなくクライアント側で行われます。

public void LiteDB_ShowAll() 
    { 
     using (var dataBase = new LiteDatabase(dbConnectionString)) 
     { 
      var collection = dataBase.GetCollection<Stranka>("stranka"); 
      lvStranke.Items.Clear(); 

      foreach(var cust in collection.FindAll().OrderByDescending(x => x.Date)) // or by x.Id 
      { 
       lvStranke.Items.Add(cust); 
      }    
     }   
    } 

LiteDB_ShowAll実装の重要な欠点は、その非効率性ではありません。 CustomerオブジェクトはDBから決して削除することができないと予想しており、これはしばしば真実ではないことが予想されます。だから、最終的にあなたのIDに "ギャップ"があり、それはあなたのコードを壊すでしょう。

+0

私は削除機能を持っていますが、これまでのところ問題はありませんでしたが、LiteDB_ShowAllは基本的にデータベースの変更を更新してListViewに表示するだけです。これは最初のアプローチでしたが、私はそのコードを追加することもできます。それを改善する方法を模索しようとしています。返信を楽しみにして、答えをありがとう! – McBooley

+0

@McBooley、私はあなたが私から何を期待しているかは分かりません。削除については、1)最大IDを持つ顧客を取得しない(最大IDよりも少ない)2)「FindById」から一部のIDに対してヌルを取得する(削除されたIDに対して) – SergGr

1

クエリのフィールドにインデックスを使用して検索すると、このような結果を注文するための最良の方法:

public void LiteDB_ShowAll() 
{ 
    using (var dataBase = new LiteDatabase(dbConnectionString)) 
    { 
     var collection = dataBase.GetCollection<Stranka>("stranka"); 
     collection.EnsureIndex("Ime_Priimek"); 

     lvStranke.Items.Clear(); 

     var result = collection 
      .Find(Query.StartsWith("Ime_Priimek", searchName_tb.Text)) 
      .OrderBy(x => x["_id"].AsInt32); 

     foreach (var item in result) 
     { 
      lvStranke.Items.Add(item); 
     }    
    }   
} 

をこのケースでは、オーダーのみフィルタリング書類が必要になります。