LINQ,我可以用方法语法编写更清晰的连接吗?

时间:2012-03-06 23:02:32

标签: linq

使用pubs

如果我想使用查询语法加入,我会这样做。

from a in db.authors
join ta in db.titleauthors on a.au_id equals ta.au_id
join t in db.titles on ta.title_id equals t.title_id
join s in db.sales on t.title_id = s.title_id
select new { a.au_lname, t.title1, s.qty }

使用方法语法

db.authors
    .Join(db.titleauthors,
        a => a.au_id,
        ta => ta.au_id,
        (a, ta) => new {a, ta})
    .Join(db.titles,
        z => z.ta.title_id,
        t => t.title_id,
        (z, t) => new { z.a, z.ta, t })
    .Join(db.sales,
        z => z.t.title_id,
        s => s.title_id,
        (z, s) => new { z.a, z.ta, z.t, s })
    .Select(z => new { z.a.au_lname, z.t.title1, z.s.qty })

我想知道是否有一种处理这条线的优雅方式
(z, X) => new { z.Y1, z.Y2, z.Y3... , X }

也许就像是 (z, X) => z.push(X)

所以我不必写出来。

这样的事情是存在还是可能?

1 个答案:

答案 0 :(得分:3)

没有。基本上存在查询表达式是为了使这些东西远离你。没有特别简单的模仿透明标识符的方法。

我发现当你点击透明标识符时,使用查询表达式语法几乎总是更清晰。绝对值得了解两者,因为非常简单的查询使用方法语法更清晰,但查询越复杂,使用查询表达式读取的可能性就越大。

当然,假设它可以用方法表达式表示。不要忘记你可以在不改变含义的情况下将查询分解为单独的语句,所以如果需要调用没有查询表达式的方法,我有时会发现最好把它分开像这样:

var foo = from x in y
          join a in b on x.Z equals a.Z
          select new { a, x };

var bar = foo.Skip(5)
             .Take(10)
             .ToList();

我发现这比使用括号将两种语法形式混合在一起更清晰。