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表达式
答案 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。
嵌套查询似乎有点奇怪。如果有一种方法来构建您的数据,那么您不必执行该嵌套查询,我认为您将获得更好的性能和更简单的查询。