LINQ - 使用 Select - 理解 select

4

我发现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> 类型吗?

可能是LINQ:点表示法 vs 查询表达式的重复问题。 - BrokenGlass
@Broken:部分A是副本,但部分B不是。 - Gabe
3个回答

5

So...

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;

1
+1 好的,如果我想要添加 Where,使用这些方法可能会变得有点棘手。不过,这只是我的看法。 - P.Brian.Mackey
没错,这些方法可能会变得很棘手。 - usr
@P.Brian.Mackey - 是的,它肯定可以。我添加了另一个简单的例子,以显示LINQ的清晰可见性。 - Tim

5

A: 这是相同的。编译器将查询表达式转换为方法调用。完全相同。

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


使用Select()和查询表达式有什么限制吗?例如,如果我想按orderby排序或使用where子句? - P.Brian.Mackey
1
不,每个查询表达式都映射到方法,因此没有什么是无法再现的。但是,并非每个方法序列都可以映射到查询表达式(例如Skip)。另请注意,方法的参数是表达式树,而不是已编译的IL代码。 - usr

1
在B中,X的类型是隐式的。你可以轻松地做如下操作:
from Row x in context.Table

而且它们是相同的。在A中,使用lambda和等效的完整LINQ语法之间没有任何区别,除了你永远不会使用.Select(x => x)。它用于转换项目。假设您有一个整数列表,.Select(x => x * x)将返回每个整数的平方。


+1 @minitech - 你能详细解释一下“永远不要使用.Select(x => x)”吗?我可以找到很多查询语法的例子,但几乎找不到方法语法或者更好的两种语法之间的转换... - P.Brian.Mackey
@P.Brian.Mackey:.Select(x => x)是多余的——它将包含(a,b,c,...)的集合转换为完全相同的东西。这样做没有意义。但如果您实际上正在使用它来转换值,则有一点意义。 - Ry-

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接