Einzelnes ORM laden

Man kann anhand der Guid der Datentabelle ein bestimmtes ORM laden und erhält als Rückgabe ein Objekt vom Typ OrmBABase. Dieses könnte man dann anschließend in die konkrete Orm Klasse casten. Oder man arbeitet anschließend mit dem Basis Objekt weiter. Dies könnte dann notwendig sein, wenn man auf eine konfigurierte Datentabelle zugreifen möchte.
Wenn man die Datentabelle programmiert hat, kann man auch direkt das konkrete Orm Objekt laden.

OrmBABase ormBase = Api.ORM.GetOrm(EnumDataSourceExtension.MyDataTable.ValueGuid, "[INSERT ORM GUID]".ToGuid(), session);
OrmMyDataTable myData = Api.ORM.GetOrm<OrmMyDataTable>("[INSERT ORM GUID]".ToGuid(), session);

Abfragen

Bei Abfragen muss man zwischen Abfragen entscheiden, die die Leserechte berücksichtigen und welche die sie nicht berücksichtigen. Mehr zum Thema Rechte findet sich im entsprechenden Kapitel.

IQueryable<OrmMyDataTable> query = Api.ORM.GetQuery<OrmMyDataTable>(session);
IQueryable<OrmMyDataTable> queryWith = Api.ORM.GetQueryWithReadPermissions<OrmMyDataTable>(session);

Mit LINQ to XPO kann man nun diese Abfragen gestalten.

queryWith = queryWith.Where(ff => ff.TextField != null && ff.TextField.Contains("Inhalt"));
int count = queryWith.Count();

Abfragen auf Basis-Datensätze

Abfragen können auch auf Basis-Datensätze erstellt werden. In diesem Fall erhält man alle Datensätze, welche von diesem Basis-Datentyp erben.

IQueryable<OrmActivityBase> activities = Api.ORM.GetQuery<OrmActivityBase>(session);
IQueryable<OrmActivityBase> activitiesWith = Api.ORM.GetQueryWithReadPermissions<OrmActivityBase>(session);

Auch Abfragen auf alle Datensätze sind möglich. Dies könnte dann notwendig sein, wenn man verschiedene Datensätze haben möchte, die keine gemeinsame Basis-Datentabelle haben.

IQueryable<OrmBABase> orms = Api.ORM.GetQuery<OrmBABase>(session);
IQueryable<OrmBABase> persons = orms.Where(ff => ff.IsType(typeof(OrmContact)) || ff.IsType(typeof(OrmUserProfile)));

Abfragen auf alle Datensätze, inkl. Leserechte sind möglich, aber man sollte unbedingt beim Erstellen der Abfrage auf die Typen der gewünschten Datensätze einschränken, da die Berücksichtigung aller Leserechte aller möglichen Typen extrem komplex ist und sich die Laufzeit der Datenbankanfrage dadurch sehr stark erhöhen kann.

IQueryable<OrmBABase> ormsWith = Api.ORM.GetQueryWithReadPermissions<OrmBABase>(session, new[] { typeof(OrmContact), typeof(OrmUserProfile) });

Performance Hinweise

Werden bei den Abfragen nicht die ORMs benötigt sollte man mit Select() die Felder konkret angeben. Dadurch wird die Größe der Abfrage beschränkt, und es muss auch kein ORM Objekt erstellt werden. Das Erstellen des ORM Objektes selbst, kann wiederum weitere Abfragen auslösen.

IQueryable<OrmMyDataTable> query = Api.ORM.GetQuery<OrmMyDataTable>(session);
var anonymousQuery = query.Select(ff => new { oid = ff.Oid, text = ff.TextField, boolean = ff.BooleanField });

Beim Formulieren der LINQ Abfragen sollte man darauf achten, dass die verwendeten Methoden in einen SQL Query umgewandelt werden können. Dadurch wird sichergestellt, das die Abfrage in Ihrer Gesamtheit dem SQL Server übergeben wird. Beispielsweise sind String-Operationen, Datum-Operationen und Zahlen-Operationen Problemlos einsetzbar. Komplexe .Net Methoden sollten aber vermieden werden.