Write Complex Linq加入Lambda Expression

时间:2013-03-03 14:43:09

标签: c# linq join lambda

这是我在linq中的加入我只是认为有任何可能的方法用lambda编写它:

enter image description here

有人对此有任何想法吗?有什么建议吗?

2 个答案:

答案 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...
});