这是我在linq中的加入我只是认为有任何可能的方法用lambda编写它:
有人对此有任何想法吗?有什么建议吗?
答案 0 :(得分:7)
所有 LINQ查询表达式都可以转换为“点符号”(方法调用) - 这基本上就是编译器所做的。但是,它为连接(以及其他一些操作)引入了透明标识符,这使得使用lambda表达式的等效代码更加繁琐。
鉴于代码最终将完全等同于查询表达式,我建议您坚持使用查询表达式版本。
如果你真的想因某种原因转换为点符号,我强烈建议你先用一个简单的例子来做 - 只有几个属性的单个连接。你会感觉到你需要做什么,并且可以逐步建立起来。
我的Edulinq post on query expression translation提供了编译器执行的所有转换的一些细节 - 这是实验的一个很好的起点。
答案 1 :(得分:3)
在没有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...
});