解释下面的Linq查询?

时间:2011-07-21 15:18:56

标签: linq linq-to-sql

results.Where(x=>x.Members.Any(y=>members.Contains(y.Name.ToLower())

我碰巧在互联网上看到了这个查询。任何人都可以解释这个问题。

建议我为这个新手提供一个很好的LINQ教程。

谢谢大家。

编辑:

x和y代表什么?

4 个答案:

答案 0 :(得分:3)

  • xresults序列中元素类型的单个结果。
  • yx.Members序列中元素类型的单个成员。

这些是使用C#3引入语言的lambda表达式(x => x.whatever),其中x是输入,右侧(x.whatever)是输出(in这种特殊的使用场景)。

更简单的例子

var list = new List<int> { 1, 2, 3 };
var oddNumbers = list.Where(i => i % 2 != 0);

此处,i是单个int项,它是表达式的输入。 i % 2 != 0是一个布尔表达式,用于评估输入是偶数还是奇数。整个表达式(i => i % 2 != 0)是一个谓词,Func<int, bool>,其中输入是一个整数,输出是一个布尔值。跟随?当您遍历查询oddNumbers时,list序列中的每个元素都将根据谓词进行评估。那些通过的东西成为你输出的一部分。

foreach (var item in oddNumbers)
    Console.WriteLine(item);

// writes 1, 3

答案 1 :(得分:1)

它是lambda expressionHere是一个很棒的LINQ教程

答案 2 :(得分:1)

有趣的查询,但我不喜欢它。

我先回答你的第二个问题。 xy是在Where()Any()调用中定义的lambda方法的参数。您可以轻松更改名称以使其更有意义:

results.Where(result => 
    result.Members.Any(member => members.Contains(member.Name.ToLower());

要回答您的第一个问题,此查询将返回results中的每个项目,Members集合中至少有一个项目也包含在Members集合中案例字符串。

通过了解Members集合是什么或它拥有什么,我的逻辑对我来说并没有多大意义。

答案 3 :(得分:0)

x将是结果集合的每个实例。该查询使用lambda语法,因此x =&gt; x。 somemember 意味着“在每个传入的x上调用somemember。在哪里是IEnumerables的扩展方法,它需要一个带参数的函数并返回一个boolean.Lambda语法在封面下创建委托,但对于执行某些类型的操作(并节省大量输入)更具表现力。

在不知道结果集合中保存的对象类型(结果将是实现IEnumerable的内容)的情况下,很难确切知道上面的代码将会做什么。但有一个有根据的猜测是,它将检查上述集合中所有x的所有成员,并返回一个IEnumerable,只有那些具有所有小写名称的成员。