LINQ - 使用选择 - 理解选择

时间:2011-05-23 21:38:55

标签: c# linq .net-4.0

我觉得LINQ有点难以理解。我喜欢这个概念,并相信它有很大的潜力。但是,在写了这么多SQL之后,语法对我来说并不容易吞下去。

A。有多种方法可以选择?

我看到我能够使用方法创建上下文并执行Select()。

context.Table.Select(lamba expression);
好的......我为什么要用这个?它与这种类型的选择相比如何?(或者是这样)?

var returnVal = from o in context.Table
                orderby o.Column
                select o;

B。请解释

的变量性质
**from X** in context.Table

为什么我们在这里贴上一个看似任意命名的变量?这不应该是<Table>类型的已知类型吗?

3 个答案:

答案 0 :(得分:5)

答:这是一样的。编译器将查询表达式转换为方法调用。完全一样。

B:x与foreach中的相同(context.Table中的var X)。您可以为表/序列的单个元素定义名称。

答案 1 :(得分:4)

因此...

var returnVal = context.Table.Select(o => o);

var returnVal = from o in context.Table
                select o;

是一样的。在第二种情况下,C#只有很好的语法糖,可以让你更接近普通的SQL语法。请注意,我从第二个查询中删除了orderby。如果你想在那里,那么第一个将成为:

var returnVal = context.Table.OrderBy(o => o.Column).Select(o => o);

至于你的上一个问题......我们在这里并没有坚持任意命名的变量。我们给每一行命名,以便我们稍后在语句中引用它。它是隐式输入的,因为系统知道Table包含的类型。

在回复你的评论时,我想补充一点想法。你提到了用普通的方法调用变得讨厌的东西。它真的可以。这是一个简单的例子,它在LINQ语法中立即更清晰(至少,如果你习惯于SQL语法):

var returnVal = context.Table.OrderBy(o => o.Column1)
                             .ThenBy(o => o.Column2)
                             .ThenBy(o => o.Column3)
                             .Select(o => o);

var returnVal = from o in context.Table
                orderby o.Column1, o.Column2, o.Column3
                select o;

答案 2 :(得分:1)

在B中,X的类型是隐式的。您可以轻松地执行以下操作:

from Row x in context.Table

它会是一样的。在A中,使用lambda和等效的完整LINQ语法之间没有任何区别,除了你永远不会.Select(x => x)。这是为了改变物品。假设您有一个整数列表,.Select(x => x * x)将返回每个整数的平方。