linq select子句语法

时间:2011-12-04 03:29:47

标签: linq select syntax

Linq Select方法将Func作为输入参数。这意味着我可以在Select的选择器中有多个语句,例如

var myresult = sources.Select(s => 
     {int x; if (s.val = high) {x=1} else if (s.val = med) {x=2} else {x=3}; return x;
     }
  )

如何使用Linq查询语法

执行此操作
var myresult = from s in sources
       select ...

这里,Func部分中的代码(if ... else if .. else)是人为的。我真正想知道的是select子句的语法,可以将其描述为

select select-expression

的语法是什么?
  

选择表达

4 个答案:

答案 0 :(得分:2)

我不想在我的代码中看到你的第一个版本。如果你需要在lambda中拥有基本上是一个完整的函数,我宁愿看到lambda只是调用一个完整的函数!换句话说......

theQuery.Select(s => GetX(s)); // just define a GetX function

这也是查询表达式语法的直接翻译

from s in sources
select GetX(s);

您将无法将完整的代码块放入查询表达式语法中。你可以把你给定的逻辑翻译成可用的东西(但是很麻烦),但是我很确定你的代码片段只是一个普遍的例子。如果不随便改变,你可以尝试

select s.val == high ? 1 : (s.val == med ? 2 : 3); // totally messy

答案 1 :(得分:0)

这是不可能的。

如果你真的想,你可以用匿名方法创建一个Func<T>并调用它,但那会很糟糕。

答案 2 :(得分:0)

使用if/else等效的switch语句代替特殊大小值,对您的值进行分组和过滤更加符合Linq:

var myResult = from s in sources
               group by s.val into g
               select new { Val = g.Key, Sources = g };

var groupHigh = myResult.Where(i => i.Val == high);
var groupMedium = myResult.Where(i => i.Val == medium);
var groupOther = myResult.Except(groupHigh.Concat(groupMedium));

请注意,我提供的代码只是一个起点,并不是实现特定目标的最佳方式。我可以通过以下方式之一解决这个问题:

  • 更改group by的使用方式(使用SomeFunction(s.Val)而不是直接使用s.Val
  • 更改此查询周围的代码,以便更好地使用自然分组,因此我不需要对这些组进行转换

答案 3 :(得分:0)

MSDN表示 select 是C#4.0的上下文关键字。所以我检查了C#语言规范4.0。其选择条款部分(7.16.2.5)指定

  

形式的查询表达式
  from x in e select v
  被翻译成
  ( e ) . Select ( x => v )
  除非v是标识符x,否则翻译只是
  ( e )

结果,

的语法
  

选择select-expresion

select-expression 应该是选择方法中可用作TResult的任何内容。因此,使用选择方法中的匿名Func可能无法使用 select子句来实现功能。

结论是你应该坚持使用Method语法,因为这就是代码真正在场景后面运行的方式。