这是我在 linq 中的加入,我只是认为有什么方法可以用 lambda 编写它:
有人对此有任何想法吗?有什么建议吗?
所有LINQ 查询表达式都可以转换为“点表示法”(方法调用)——这基本上就是编译器所做的。但是,它为连接(和一些其他操作)引入了透明标识符,这使得使用 lambda 表达式的等效代码更加繁琐。
鉴于代码最终将完全等同于查询表达式,我建议您坚持使用查询表达式版本。
如果您出于某种原因确实想转换为点表示法,我强烈建议您首先使用一个简单的示例来执行此操作 - 只有几个属性的单个连接。你会感觉到你需要做什么,并且可以逐渐建立起来。
我关于查询表达式翻译的 Edulinq 帖子给出了编译器执行的所有转换的一些细节——这是一个很好的实验起点。
在没有 IDE 的情况下键入它,所以肯定有一些错误......
join ... on ... equals ... into
变成GroupJoin
from ... in group.DefaultIfEmpty
变成SelectMany( group.DefaultIfEmpty)
除此之外,这一切都是关于使用更多匿名类型来管理范围。
var joinResult1 = FormReportDataTable.AsEnumerable()
.GroupJoin(dtFormsCategories.AsEnumerable(),
dr1 => dr1["FormID"], dr2 => dr2["ObjectID"],
(dr1, dr2s) => new {dr1 = dr1, dr2s = dr2s})
.SelectMany(g => g.dr2s.DefaultIfEmpty(), (g, dr2) => new {dr1 = g.dr1, dr2 = dr2 })
.GroupJoin(drEntities.AsEnumerable(),
x => (Guid)x.dr1["EntityID"], er => (Guid)er["ID"],
(x, ers) => new {dr1 = x.dr1, dr2 = x.dr2, ers = ers})
.SelectMany(g => g.ers.DefaultIfEmpty(), (g, er) => new {dr1 = g.dr1, dr2 = g.dr2, er = er })
.GroupJoin(dtCategories.AsEnumerable(),
x => (Guid)x.dr2["CategoryID"], cr => (Guid)cr["ID"],
(x, crs) => new {dr1 = x.dr1, dr2 = x.dr2, er = x.er, crs = crs})
.SelectMany(g => g.crs.DefaultIfEmpty(), (g, cr) => new {dr1 = g.dr1, dr2 = g.dr2, er = g.er, cr = cr })
var joinResult = joinResult1.Select(x => new
{
SubPortalName = x.cr == null ? string.Empty : ...
... //could have posted this code if it was in the question...
});