大家好,我很难将下面的linq表达式(左连接实现)转换为lambda表达式(用于学习).
var result = from g in grocery
join f in fruit on g.fruitId equals f.fruitId into tempFruit
join v in veggie on g.vegid equals v.vegid into tempVegg
from joinedFruit in tempFruit.DefaultIfEmpty()
from joinedVegg in tempVegg.DefaultIfEmpty()
select new { g.fruitId, g.vegid, fname = ((joinedFruit == null) ? string.Empty : joinedFruit.fname), vname = ((joinedVegg == null) ? string.Empty : joinedVegg.vname) };
Run Code Online (Sandbox Code Playgroud)
有人可以建议我如何做到这一点.
如果有人给我"C#Lambdas&Linqs"的优秀教程链接,我真的很感激
我通常使用ReSharper来帮助我将事物转换为方法链和lambda's,这有助于我来回相当容易.
var result = from g in grocery
join f in fruit on g.fruitId equals f.fruitId into tempFruit
join v in veggie on g.vegid equals v.vegid into tempVegg
from joinedFruit in tempFruit.DefaultIfEmpty()
from joinedVegg in tempVegg.DefaultIfEmpty()
select new { g.fruitId, g.vegid, fname = ((joinedFruit == null) ? string.Empty : joinedFruit.fname), vname = ((joinedVegg == null) ? string.Empty : joinedVegg.vname) };
Run Code Online (Sandbox Code Playgroud)
然后使用ReSharper将LINQ转换为方法链的选项等于以下内容:
var result =grocery .GroupJoin(fruit, g => g.fruitId, f => f.fruitId, (g, tempFruit) => new {g, tempFruit})
.GroupJoin(veggie, @t => @t.g.vegid, v => v.vegid, (@t, tempVegg) => new {@t, tempVegg})
.SelectMany(@t => @t.@t.tempFruit.DefaultIfEmpty(), (@t, joinedFruit) => new {@t, joinedFruit})
.SelectMany(@t => @t.@t.tempVegg.DefaultIfEmpty(),(@t, joinedVegg) =>
new
{
@t.@t.@t.g.fruitId,
@t.@t.@t.g.vegid,
fname = ((@t.joinedFruit == null) ? string.Empty : @t.joinedFruit.fname),
vname = ((joinedVegg == null) ? string.Empty : joinedVegg.vname)
});
Run Code Online (Sandbox Code Playgroud)
当然,输出不太合乎需要,但它至少有助于在理解语法的某个地方开始.