【问题标题】:LINQ - Using Select - understanding selectLINQ - 使用选择 - 理解选择
【发布时间】:2011-08-31 11:53:25
【问题描述】:

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

【问题讨论】:

标签: c# linq .net-4.0


【解决方案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: .Select(x => x) 是多余的—它将包含 (a, b, c, ...) 的集合转换为完全相同的东西。这样做没有意义。现在,如果您实际上是在使用它来转换值,那就有道理了。
【解决方案2】:

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

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

【讨论】:

  • 使用 Select() 和查询表达式有什么限制吗?例如,如果我想 orderby 或使用 where 子句?
  • 没有。每个查询表达式都映射到方法,因此没有什么是不可重现的。然而,并非每个方法序列都可以映射到查询表达式(例如 Skip)。另请注意,方法的参数是表达式树,而不是编译的 IL 代码。
【解决方案3】:

所以...

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 好的,所以如果我想添加 Where,使用这些方法可能会有点难看。嗯,反正我就是这么看的。
  • 没错,这些方法可能会很糟糕。
  • @P.Brian.Mackey - 是的,绝对可以。我添加了另一个简单的示例来展示如何保持干净的 LINQ。
猜你喜欢
  • 2021-07-12
  • 1970-01-01
  • 1970-01-01
  • 2016-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-17
  • 2023-03-05
相关资源
最近更新 更多