2 Visual Basic - LINQ

LINQ ("Language Integrated Query")

LINQ ist eine Abfragesprache von Microsoft für VisualBasic (und C#). Die Ausdrücke ermöglichen es Ihnen unter anderem Listen zu sortieren, zu durchsuchen, zu gruppieren, zu summieren und zu filtern.

Die können LINQ auf zwei Arten schreiben:

  • Abfrage-Syntax (Query)

  • Methoden-Syntax (Method)

Beide Schreibweisen sind gleichwertig. 

LINQ Ausdruck (VB) - Query Syntax
' Liefert die Namen aller Dateien der Auflistung "aFileInfoArray", die größer als 10000 Byte ist und auf ".txt" enden. (FROM fileInfo IN aFileInfoArray WHERE fileInfo.FileSize>10000 AND fileInfo.Extension.ToUpper()=".TXT" SELECT fileInfo.FullName).ToList()
LINQ Ausdruck (VB) - Method Syntax
' Liefert die Namen aller Dateien der Auflistung "aFileInfoArray", die größer als 10000 Byte ist und auf ".txt" enden. aFileInfoArray.Where(Function(fileInfo) fileInfo.FileSize>10000 and fileInfo.Extension.ToUpper()=".TXT" ).Select(Function(fileInfo) fileInfo.FullName).ToList()

Weitere Hilfestellungen und Informationen zu LINQ finden Sie u.a. hier:



Linq immer mit ToList() abschließen!

Damit Workflows den LINQ-Ausdruck auch nach einer Pausierung (z.B. durch ein Delay) fehlerfrei verarbeiten können ist ist am Ende immer ein ToList() notwendig.
Hintergrund: Ohne ToList wird eine Auflistung vom Typ IEnumerable<XY> erzeigt. Beim Pausieren werden alle Werte der Workflow-Instanz serialisiert und gespeichert. IEnumerable<XY> ist mit der Workflow Engine nicht serialisierbar, List<XY> schon.


 

Beispiele

Filtern nach Dateigröße

Es sollen nur Dateien, die größer als 10000 Bytes sind ermittelt werden.

Gehen Sie wie folgt vor:

  • Ermitteln Sie mir der Aktivität "Dateien ermitteln" alle Dateien eines Verzeichnisses. Das Ergebnis erhalten Sie in der Variable "aFileInfo" vom Typ "List of FileInfo"

  • Mit einer Assign-Aktivität können Sie nun eine LINQ-Abfrage anwenden und diese Liste filtern:

    • Der Ausdruck "(FROM fileInfo IN aFileInfoArray WHERE fileInfo.FileSize > 10000 SELECT fileInfo.FileName).ToList()" selektiert alle Dateinamen der gesuchten Dateien

    • Mit "ToList" am Ende geben Sie an, dass sie die gefundenen Einträge in eine Liste schreiben möchten (hier in die Liste "bigFiles")

 

Nur das erste gefundene Element ermitteln

Um das erste gefundene Element zu protokollieren gibt man z.B.

  • (FROM fileInfo IN aFileInfoArray WHERE fileInfo.FileSize > 10000 SELECT fileInfo.FileName).toArray(0), oder

  • (FROM fileInfo IN aFileInfoArray WHERE fileInfo.FileSize > 10000 SELECT fileInfo.FileName).).FirstOrDefault()

Gruppieren und Summieren (z.B. im Rechnungspositionen)

In diesem Codebeispiel werden alle Buchungssätze unseres Rechnungsobjekts mit dem selben Buchungskonto zusammengefasst. Dabei wird der Betrag in dem zusammengefassten Datensatz summiert.

(From record In wmsInvoice.AccountingInformation.AccountingRecordsGroup record By record.AccountNo.ToUpper() Into groupedRecords = Group Let firstRecord = groupedRecords.First() Select new WmsAccountingRecord With{     .Amount = groupedRecords.Sum(Function(p) p.Amount),     .Quantity = groupedRecords.Sum(Function(p) p.Quantity),     .AccountNo = firstRecord.AccountNo,     .CostCenterId = firstRecord.CostCenterId,     .ContraAccountNo = firstRecord.ContraAccountNo} ).ToList()
Workflow
Variablenliste