2011-11-28 112 views
-3
from _tupleRows in this.TupleSet 
from _member in _tupleRows.Members 
where (_member.HasChildMembers && !_member.DrilledDown) 
select new 
{ 
    _member1 = _member, 
    _member2 = (from _searched in this.TupleSet 
       from _compareMember in _searched.Members 
       where (_member.UniqueName == _compareMember.UniqueName && 
        _member.LevelDepth == _compareMember.LevelDepth && 
        _compareMember.DrilledDown) 
       select _compareMember).FirstOrDefault() 
}; 

我需要这个简单的LINQ表达式转换为等效的lambda表达式转换一个普通的LINQ查询lambda表达式

+2

请不厌其烦地将代码格式化以提高可读性。它的缩进太多 - 为什么我们需要滚动?在那里,为你解决这个问题。 – Oded

+1

下载LinqPad,它会为你“转换”它。 – Magnus

+0

Resharper可以在几次点击中为您做到这一点。 – spender

回答

0
from _tupleRows in this.TupleSet 
from _member in _tupleRows.Members 
where (_member.HasChildMembers && !_member.DrilledDown) 
select new 
{ 
    _member1 = _member, 
    _member2 = (from _searched in this.TupleSet 
       from _compareMember in _searched.Members 
       where (_member.UniqueName == _compareMember.UniqueName 
        && _member.LevelDepth == _compareMember.LevelDepth 
        && _compareMember.DrilledDown) 
       select _compareMember).FirstOrDefault() 
}; 

变为:

this.TupleSet 
    .SelectMany(tupleRows => 
     tupleRows.Members 
      .Where(member => member.HasChildMembers && !member.DrilledDown) 
      .Select(member => new 
      { 
       _member1 = member, 
       _member2 = this.TupleSet 
        .SelectMany(searched => 
         searched.Members 
          .Where(compareMember => 
           member.UniqueName == compareMember.UniqueName 
          && member.LevelDepth == compareMember.LevelDepth 
          && compareMember.DrilledDown)) 
        .FirstOrDefault(), 
      })); 
0

他们真的并不难兑换。只需从顶部开始,随时随地追加。

喜欢的东西:

this.TupleSet.SelectMany(ts => ts.Members) 
    .Where(m => m.HasChildMembers && !m.DrilledDown) 
    .Select(m => new 
    { 
     _member1 = m, 
     _member2 = this.TupleSet.SelectMany(ts => ts.Members) 
      .Where(other => m.UniqueName == other.UniqueName 
       && m.LevelDepth == other.LevelDepth 
       && other.DrilledDown 
       ) 
      .FirstOrDefault() 
    }); 

没有保证,这是完美的,甚至会编,但当时我并不想这样做你的工作对你来说,我想给你的你如何演示可能会自己做这些转换。

此外,请尽可能帮助自己并在lambda表达式中使用更简单的标识符。它们的范围是非常有限的,而且你将呼叫串联起来形成一个大的声明,所以在变量的意义上,它通常会非常明显。我可能在这里没有最好的例子,但原始的变量名称太冗长了,国际海事组织。

嵌套查询也似乎有点奇怪。如果有一种方法来构造你的数据,所以你不必做这个嵌套查询,我想你会得到更好的性能和更简单的查询。