1

这是我在 linq 中的加入,我只是认为有什么方法可以用 lambda 编写它:

在此处输入图像描述

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

4

2 回答 2

7

所有LINQ 查询表达式都可以转换为“点表示法”(方法调用)——这基本上就是编译器所做的。但是,它为连接(和一些其他操作)引入了透明标识符,这使得使用 lambda 表达式的等效代码更加繁琐。

鉴于代码最终将完全等同于查询表达式,我建议您坚持使用查询表达式版本。

如果您出于某种原因确实想转换为点表示法,我强烈建议您首先使用一个简单的示例来执行此操作 - 只有几个属性的单个连接。你会感觉到你需要做什么,并且可以逐渐建立起来。

关于查询表达式翻译的 Edulinq 帖子给出了编译器执行的所有转换的一些细节——这是一个很好的实验起点。

于 2013-03-03T14:53:52.320 回答
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...
});
于 2013-03-05T04:01:03.947 回答