我觉得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>
类型的已知类型吗?
答案 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)
将返回每个整数的平方。