如何:确定序列中的元素是否部分或全部满足条件 (LINQ to SQL)

更新:November 2007

如果序列中的所有元素都满足某一项条件,则 All<TSource> 运算符会返回 true。

如果序列中的任意一个元素满足某一项条件,则 Any 运算符会返回 true。

示例

下面的示例返回由至少下了一个订单的客户组成的序列。如果给定的 Customer 下了任何 Order,则 Where/where 子句的计算结果将为 true。

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;

下面的 Visual Basic 代码确定未下订单的客户的列表,并确保对于该列表中的每一位客户,都提供了联系人名称。

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

下面的 C# 示例返回由订单包含以“C”开头的 ShipCity 的客户组成的序列。返回结果中还包括未下订单的客户。(按照设计,对于空序列,All<TSource> 运算符返回 true。)通过使用 Count 运算符在控制台输出中消除了未下订单的客户。

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);
    }
}

请参见

其他资源

查询示例 (LINQ to SQL)