我有以下加入:
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
作为我的源集合吗?我想知道如果我们有多个连接,我们如何管理过滤。
答案 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));