将普通的LINQ查询转换为lambda表达式

时间:2011-11-28 10:30:37

标签: linq

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表达式

2 个答案:

答案 0 :(得分: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(),
            }));

答案 1 :(得分: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()
    });

不保证这是完美的或者甚至可以编译,但是我不是想为你做你的工作,我试图给你演示如何自己进行这些转换。

另外,尽可能帮自己一个忙,并在lambdas中使用更简单的标识符。它们的范围非常有限,而且你正在联系调用以做出一个大的陈述,因此在变量意味着什么的上下文中通常会非常明显。我可能没有最好的例子,但原始的变量名称太冗长了,IMO。

嵌套查询似乎有点奇怪。如果有一种方法来构建您的数据,那么您不必执行该嵌套查询,我认为您将获得更好的性能和更简单的查询。