Gewusst wie: Ermitteln, ob Any- oder All-Elemente in einer Sequenz eine Bedingung erfüllen (LINQ to SQL)

Aktualisiert: November 2007

Der All<TSource>-Operator gibt true zurück, wenn alle Elemente in einer Sequenz eine Bedingung erfüllen.

Der Any-Operator gibt true zurück, wenn ein beliebiges Element in einer Sequenz eine Bedingung erfüllt.

Beispiel

Im folgenden Beispiel wird eine Sequenz von Kunden mit mindestens einer Bestellung zurückgegeben. Die Where/where-Klausel gilt als true, wenn der betreffende Customer (Kunde) eine beliebige Order (Bestellung) aufweist.

Dim OrdersQuery = _
    From cust In db.Customers _
    Where cust.Orders.Any() _
    Select cust
var OrdersQuery =
    from cust in db.Customers
    where cust.Orders.Any()
    select cust;

Der folgende Visual Basic-Code ermittelt die Liste der Kunden, die noch keine Bestellungen übermittelt haben. Außerdem wird sichergestellt, dass für jeden Kunden in dieser Liste Kontaktinformationen angegeben werden.

Public Sub ContactsAvailable()
    Dim db As New Northwnd("c:\northwnd.mdf")
    Dim result = _
        (From cust In db.Customers _
        Where Not cust.Orders.Any() _
        Select cust).All(AddressOf ContactAvailable)

    If result Then
        Console.WriteLine _
    ("All of the customers who have made no orders have a contact name")
    Else
        Console.WriteLine _
    ("Some customers who have made no orders have no contact name")
    End If
End Sub

Function ContactAvailable(ByVal contact As Object) As Boolean
    Dim cust As Customer = CType(contact, Customer)
    Return (cust.ContactTitle Is Nothing OrElse _
        cust.ContactTitle.Trim().Length = 0)
End Function

Im folgenden C#-Beispiel wird eine Sequenz von Kunden zurückgegeben, deren Bestellungen einen ShipCity (Lieferort) aufweisen, der mit "C" anfängt. Außerdem werden Kunden ohne bisherige Bestellungen zurückgegeben. (Per Definition gibt der All<TSource>-Operator bei einer leeren Sequenz true zurück.) Kunden ohne Bestellungen werden mithilfe des Count-Operators von der Konsolenausgabe ausgeschlossen.

var custEmpQuery =
    from cust in db.Customers
    where cust.Orders.All(o => o.ShipCity.StartsWith("C"))
    orderby cust.CustomerID
    select cust;

foreach (Customer custObj in custEmpQuery)
{
    if (custObj.Orders.Count > 0)
        Console.WriteLine("CustomerID: {0}", custObj.CustomerID);
    foreach (Order ordObj in custObj.Orders)
    {
        Console.WriteLine("\t OrderID: {0}; ShipCity: {1}",
            ordObj.OrderID, ordObj.ShipCity);
    }
}

Siehe auch

Weitere Ressourcen

Beispiele für Abfragen (LINQ to SQL)