LINQ的 - 关于“任何”的方法

问题描述:

问题的假设是我对了AdventureWorks数据库以下查询:LINQ的 - 关于“任何”的方法

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。

+0

你不明白的是什么?它是第一个返回行和第二个布尔值的例子吗? – archil 2011-06-16 12:05:40

+0

@archil - 确实如此。 – 2011-06-16 12:21:50

第一个查询可以理解为

返回谁在达拉斯任何 地址的所有客户。

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

第二个查询我是否谁在拉哥任何 地址的任何客户?

结果是yes或no(true或false)。您已申请Any均为地址以及地址上的Any的结果。因此,查询的第一部分是“通过拉哥地址的客户过滤”,第二部分是“现在我想知道的是,如果我有这样的客户。”

现在有意义吗?

由于您使用Any方法作为select语句的where子句,因此您将得到满足谓词的行的列表,该列表将选择行的列表。

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

对于客户中的每个元素(每个客户是或否),评估哪些地方的统计数据。所以你得到了所有具有任何地址城市=达拉斯的客户。

第二个陈述明确地说告诉我,如果任何客户有一个地址城市=拉戈。(是或否)

  • 对于每个customerCustomer
  • 当的customerCustomerAddresses收集有一个City场匹配"Dallas"
  • 选择“的名字和地址的集合至少一个Address的客户“。

我这里还有您的两个实例在方法的语法重写(第一个是在混合语法在示例中,第二已在法)

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 =>返回enumerable结束。第二个以Any =>结束返回bool

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

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

你的第二个例子是几乎完全一样,只是它代替Where的使用外Any。这是,格式化代码匹配上面:

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。