假设我对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。
答案 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
的集合至少有一个Address
且City
字段与"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