从LINQ查询语法转换为方法语法

时间:2014-01-29 00:41:56

标签: c# linq

我有以下加入:

var simpleJoin = from b in books
                 join p in publishers on b.PublisherName equals p.Name
                 where p.Id == 1
                 select b;

使用方法语法的等价物是什么?我被过滤器绊倒了:

simpleJoin = books.Join(publishers, p => p.PublisherName, b => b.Name, (b, p) => b).Where(*can't access publishers here*)

我可以不使用books作为我的源集合吗?我想知道如果我们有多个连接,我们如何管理过滤。

3 个答案:

答案 0 :(得分:2)

您需要在resultSelector中同时包含 b p 。例如,使用匿名类型的对象:

simpleJoin = books.Join(publishers, p => p.PublisherName, b => b.Name, 
        (b, p) => new { b = b, p = p })
    .Where(result => result.p.Id == 1)
    .Select(result => result.b);

答案 1 :(得分:2)

您可以在将publishers列表加入books之前对其进行过滤:

var simpleJoin = books.Join(publishers.Where(p => p.Id == 1),
                             b => b.PublisherName, p => p.Name, (b, p) => b);

答案 2 :(得分:0)

就像例子一样 - 你也可以在没有join子句的情况下实现它:

books.Where(b => publishers.Exists(p => p.Name == b.PublisherName && p.Id == 1));