Abfragen

Keine RowSets, DataSets oder ähnliches - nur Objekte
  • Linq-Queries
  • SQL-ähnliche Abfragesprache zur Formulierung der Abfragebedingungen
  • Wahlweise auch SQL-Abfragen

Sie arbeiten in NDO nicht mit Row-Sets oder ähnlichen datenbankzentrierten Dingen, sondern mit .NET-Containerklassen wie List<T>, die die abgefragten Objekte enthalten. Eine Abfrage wird folgendermaßen vorgenommen:

var alleMitarbeiter = persistenceManager.Objects<Mitarbeiter>();

Objects<Mitarbeiter> ist eine virtuelle Tabelle, die eine SQL-Abfrage auslöst, wenn man die virtuelle Tabelle benutzt, zum Beispiel in einer foreach-Anweisung.

Die virtuellen Tabellen können mit Linq abgefragt werden:

from m in persistenceManager.Objects<Mitarbeiter>() where m.Gehalt > 50000 select m; 

oder

from m in alleMitarbeiter where m.Gehalt > 50000 select m;

Hierbei ist Gehalt ein sogenanntes Accessor-Property, dessen Getter ein privates Feld der Klasse Mitarbeiter zurückgibt. NDO speichert und mappt diese privaten Felder. 

Folgende Abfrage ist etwas komplexer:

var result = from c in persistenceManager.Objects<Customer> where c.Orders.OrderItems.Product.Name == "Hemd" select c;

Dies erzeugt folgende SQL-Abfrage:

SELECT Customer.* FROM Customer 
INNER JOIN Orders ON Orders.IDCustomer = Customer.ID
INNER JOIN OrderItem ON OrderItem.IDBestellung = Orders.ID
INNER JOIN Product ON Product.ID = OrderItem.IDProduct
WHERE Product.Name = 'Hemd'

In komplizierteren Situationen können Sie auch direkt SQL-Abfragen absetzen. Solange diese Abfragen Rows erzeugen, die mit den Spalteninformationen in der Mapping-Datei übereinstimmen, generiert NDO automatisch Objekte aus diesen Rows:

NDOQuery<Employee> q = new NDOQuery<Employee>(pm, "SELECT * FROM Employees WHERE income > 50000", false, Query.Language.Sql);
List<Employee> l = q.Execute(); // l enthält Employee objects

 

-> Vererbung und Polymorphie