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