2009-06-22 12 views
4

Wie übergeben Sie einen Klassentyp in C# in eine Funktion?Abfragen nach Typ in DB4O

Als ich in db4o und C# bin immer habe ich die folgende Funktion nach den Anleitungen zu lesen:

public static void PrintAllPilots("CLASS HERE", string pathToDb) 
    { 
     IObjectContainer db = Db4oFactory.OpenFile(pathToDb); 
     IObjectSet result = db.QueryByExample(typeof("CLASS HERE")); 
     db.Close(); 
     ListResult(result); 
    } 

Antwort

11

Es gibt zwei Möglichkeiten. Die erste besteht darin, explizit den Type-Typ zu verwenden.

public static void PrintAllPilots(Type type, string pathToDb) 
{ 
    ... 
    IObjectSet result = db.QueryByExample(type); 
} 

PrintAllPilots(typeof(SomeType),somePath); 

Das zweite ist, Generika

public static void PrintAllPilots<T>(string pathToDb) 
{ 
    ... 
    IObjectSet result = db.QueryByExample(typeof(T)); 
} 

PrintAllPilots<SomeType>(somePath); 
+0

Beat mich zu den Generika. Das gibt Bonus-Wiederverwendbarkeit für jeden Typ in der Datenbank gespeichert –

1

Ich denke, das ist das, was Sie wollen:

public static void PrintAllPilots(Type classType, string pathToDb) 
{ 
    IObjectContainer db = Db4oFactory.OpenFile(pathToDb); 
    IObjectSet result = db.QueryByExample(classType); 
    db.Close(); 
    ListResult(result); 
} 
0

Sie entweder durch Type mit manuell tun können, verwenden:

public static void PrintAllPilots(Type type, string pathToDb) 

Oder Sie könnten Generika den Typ ableiten verwenden:

public static void PrintAllPilots<T>(string pathToDb) 
{ 
    //... 
    var result = db.QueryByExample(typeof(T)); 
} 
5

Die Die Antworten von Jon, Jared und Yshuditelu verwenden Query-by-Example, was den DB4o-Abfragemechanismus weitgehend unbenutzt und möglicherweise in der Zukunft veraltet sein könnte.

Die bevorzugte Methode zum Abfragen von DB4O für .NET ist native Abfragen und LINQ.

// Query for all Pilots using DB4O native query: 
var result = db.Query<Pilot>(); 

Oder alternativ mit Linq-to-DB4O:

// Query for all Pilots using LINQ 
var result = from Pilot p in db 
      select p; 

Beide dieser Arbeit vorausgesetzt, Sie kennen die Art (zum Beispiel Pilot) bei der Kompilierung. Wenn Sie nicht die Art zum Zeitpunkt der Kompilierung bekannt ist, können Sie stattdessen eine DB4O SODA-Abfrage verwenden:

var query = db.Query(); 
query.Constrain(someObj.GetType()); 
var results = query.Execute(); 

bearbeiten Warum LINQ anstelle von SODA, Query-by-Example (QBE) oder india Abfrage (NQ)? Weil LINQ das Ausführen von Abfrageausdrücken sehr natürlich macht. Zum Beispiel, hier ist, wie Sie für Piloten namens Michael abfragen würde:

var michaelPilots = from Pilot p in db 
        where p.Name == "Michael" 
        select p; 

Und LINQ ist zusammensetzbare, das heißt, Sie Dinge wie diese tun können:

var first20MichaelPilots = michaelPilots.Take(20); 

Und Sie werden noch eine effiziente Abfrage erhalten Wird in DB4O ausgeführt, wenn Sie über die Ergebnisse iterieren. Das gleiche in SODA oder QBE oder NQ zu tun, ist bestenfalls hässlich.

+0

Ich habe bereits mit LINQ gearbeitet und muss zugeben, dass es Augenschmaus in allen Aspekten ist. Wird als nächsten Schritt in native Abfrage einarbeiten. Danke für den Hinweis! –

+0

Ich habe den Beitrag geändert, um zu erklären, warum LINQ wünschenswert ist. –