Linq - 关于'任何'方法的问题

时间:2011-06-16 11:58:16

标签: linq

假设我对AdventureWorks DB有以下查询:

var result = from customer in Customer
    where customer.CustomerAddress.Any (ca => ca.Address.City == "Dallas")
    select new
    {
        customer.Individual.Contact.FirstName,
        Addresses = customer.CustomerAddress
    };

此查询将返回所有居住在达拉斯的客户。但是,我不确定它为什么会起作用。我知道'Any'方法返回一个布尔值,具体取决于序列中的任何行是否满足谓词。但是以这种方式使用,它似乎实际上返回了一系列满足谓词的行。我想我不确定这里到底发生了什么。

但是,按照以下方式使用,很容易理解“任何”是如何工作的:

var result = Customer.Any (c => c.CustomerAddress.Any (ca => ca.Address.City == "Largo" ) );

这会返回false,因为没有客户住在Largo。

6 个答案:

答案 0 :(得分:11)

第一个查询可以读作

  

归还所有拥有任何客户的客户   达拉斯的地址。

查询中的响应或结果是“这里是那些客户”。第一个查询Any严格违反地址。因此,返回具有满足Any地址的客户。

第二个查询为

  

我有任何客户吗?   Largo的地址?

结果是是或否(真或假)。您已将Any 地址以及Any地址的结果应用于{{1}}。所以查询的第一部分是“由Largo地址的客户过滤”,第二部分是“现在我想知道的是我是否有这样的客户。”

现在有意义吗?

答案 1 :(得分:4)

Any返回一个bool,但它被输入where子句。 where子句采用布尔表达式,将其应用于序列中的每个项目,并返回表达式为true的项目。因此,在扩展方法语法中,您的查询转换为:

var result = Customer
             .Where(customer => customer.CustomerAddress.Any(ca => ca.Address.City == "Dallas"))
             .Select(customer => new { /*...*/ });

您的第二个示例几乎完全相同,只是它使用外部Any代替Where。在这里,格式化以匹配上面的代码:

var result = Customer
             .Any(c => c.CustomerAddress.Any(ca => ca.Address.City == "Largo"));

进一步简化,发生的事情变得更加清晰:

var result1 = Customer
              .Where(customer => customer.HasAnyAddressHere);

var result2 = Customer
              .Any(customer => customer.HasAnyAddressHere);

我们看到Where子句真正推动了您的第一次查询。你可以用英文写成:

  

给我所有在达拉斯至少有一个地址的客户。忽略他们的其他地址。如果客户在达拉斯没有地址,请将他/她从结果中过滤掉。

如您所见,这是要求客户列表。第二个是:

  

至少有一位客户在达拉斯至少有一个地址吗?

这是一个是/否的问题,所以它返回true或false。

答案 2 :(得分:1)

您正在获取满足谓词的行列表,因为您使用Any方法作为select语句的where子句,它将选择行列表。

所以你的第一个例子说'选择所有地址'城市等于达拉斯'的地址的客户。 Any没有返回行列表(它只是作为where子句的条件),select语句是。

答案 3 :(得分:1)

对于Customer中的每个元素,评估where where statment(对每个客户是yes或no)。因此,您将获得所有拥有Any address city = Dallas的客户。

第二条规则明确告诉我,如果有任何客户有地址city = Largo。 (是或否)

答案 4 :(得分:1)

  • customer
  • 中的每个Customer
  • CustomerAddresses customer的集合至少有一个AddressCity字段与"Dallas"匹配
  • 选择“客户的名字和地址集合”。

答案 5 :(得分:1)

以下是您在方法语法中重写的两个示例(第一个是在您的示例中使用混合语法,第二个已经在方法中)

    IEnumerable result = Customers
    .Where(c => c.CustomerAddress.Any(ca => ca.Address.City == "Dallas"))
    .Select(c=> new { FirstName = c.Individual.Contact.FirstName, Addresses = c.Addresses};

    //vs

    bool result = Customers.Any (c => c.CustomerAddress.Any (ca => ca.Address.City == "Dallas" ) );

查看作业?第一个语句以Select =>结束返回可枚举。第二个以Any =>结尾返回bool