LightSwitch – Genauer hingeschaut Teil 1 (Teil 3)
Kommentare

Abfragen hausgemacht
Damit diesem Umstand abgeholfen werden kann, geht es nun ans Eingemachte. Wählen Sie die betreffende Abfrage im Solution Explorer aus und klicken Sie im Eigenschaftenfenster auf

Abfragen hausgemacht

Damit diesem Umstand abgeholfen werden kann, geht es nun ans Eingemachte. Wählen Sie die betreffende Abfrage im Solution Explorer aus und klicken Sie im Eigenschaftenfenster auf EDIT ADDITONAL QUERY CODE. Daraufhin wird automatisch in einer neuen Klasse DataApplicationService eine Methode generiert, in der nun effektiv in die Verarbeitung der Abfrage per Code eingegriffen werden kann. Das LightSwitch-Entwicklerteam hat auch hier bei der Nomenklatur eine sinnvolle Lösung gefunden: Die für eine Abfrage erstellte Methode trägt den Namen _PreprocessQuery. Darüber hinaus wird eine Abfrage vom Typ IQueryable übergeben, mit der man arbeiten kann. Und, alle Parameter, die per Designer definiert wurden, werden mit dem (nullable) Datentyp als Methodenparameter übergeben und stehen damit zur Verfügung. Listing 1 zeigt das so erstellte Grundgerüst der Methode HeadSinclair_PreprocessQuery.

Listing 1: Grundgerüst von „HeadSinclair_PreprocessQuery“

public partial class ApplicationDataService
{
partial void HeadSinclair_PreprocessQuery(int? MinDepartments, 
                                                 ref IQueryable query)
{
  //Ihr Code hier
     }
}  

Die eigentliche Modifikation der Abfrage erfolgt per LINQ. So fällt es nicht schwer, die Menge der Abteilungen aus der Abfrage zu ermitteln und entsprechend nach diesen einzuschränken. Listing 2 zeigt die erweiterte Methode, die anhand des aktuellen Departments die Zugehörigkeit des Leiters zu mindestens MinDepartments-Abteilungen getestet wird. Die Einschränkung, dass diese Person mit Nachnamen Sinclair heißen muss, haben wir bereits vorher per Designer vorgenommen, sodass diese ebenfalls berücksichtigt wird.

Listing 2: Die erweiterte Methode „HeadSinclair_PreprocessQuery“

public partial class ApplicationDataService
{
partial void HeadSinclair_PreprocessQuery(int? MinDepartments, ref       IQueryable query)
     {
       query = (from department in query
                     from participationDeps in department.Head.Departments
                     where department.Head.Departments.Count() > MinDepartments
                     select department);
}
}  

In der zweiten und dritten Zeile der Reinitialisierung des IQueryable-Objekts query haben wir bereits Möglichkeiten angewandt, die per Designer nicht möglich gewesen wären. Dazu gehört in der dritten Zeile der query-Zuweisung die Verwendung der Aggregatfunktion Count(). Diese kann im Designer genauso wenig eingesetzt werden wie ihre verwandten Funktionen Aggregate() oder Sum().

Dazu gesellt sich der Umstand, dass mit participationDeps alle Abteilungen des Heads herausgesucht werden – im Prinzip hat man also auf die Navigationseigenschaft Departments der Klasse Person zugegriffen. Da der Endpunkt aber eine höhere Multiplizität als 1 aufweist (eine Person kann beliebig vielen Abteilungen angehören), wäre die Verwendung dieser Eigenschaft im Designer nicht erlaubt gewesen. Ein Blick auf das entsprechende Auswahlfeld im Abfragendesigner bestätigt dies (Abb. 7).

Abb. 7: Fehlen der Navigationseigenschaft 1 im Designer“ />
Abb. 7: Fehlen der Navigationseigenschaft „Departments“ mit Multiplizität > 1 im Designer
Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -