Linq to SQL lambda join

8

我遇到了困难,我尝试了多个示例但是还是无法理解。使用非lambda方式很容易理解,但是如何使用lambda表达式进行连接呢?

var myCats = GetAllCats();
var myHouses = GetAllHouses();

// pseudosql:  select * from a inner join b on a.id = b.id

我尝试过这个方法:
var fullData = myCats.Join(myHouses, a => a.id, b => b.id, (a, b) => a);

我有点通过查看 SO 上的其他示例搞定了,但是 fullData 的类型是 IEnumerable<Cat>,因此我无法从 Houses 中提取任何属性。

4个回答

30
var fullData = myCats.Join(
                 myHouses, 
                 cat => cat.id, 
                 house => house.id, 
                 (cat, house) => 
                   new 
                   { 
                     Cat = cat, 
                     House = house 
                   });

可以通过fullData.First().Cat... 或者 fullData.First().House... 访问。


9
感谢您使用具有更多上下文的变量名称,而不是使用“foo”和“bar”。 - The Muffin Man
1
更改了lambda参数,使其更易读。 - Femaref

6
问题是,您加入的结果——Join方法的最后一个参数——是一只猫(Cat),这就是为什么fullData的类型是IEnumerable 。如果您想访问两者,请返回匿名类型:
var fullData = myCats.Join(myHouses, a => a.id, 
                                     b => b.id,
                                     (a, b) => new { Cat = a, House = b});

5

您需要明确您想从它们中选择的内容。

您可以将后者更改为:

var fullData = myCats.Join(myHouses, cat => cat.id, house => house.id, (cat, house) => new {cat, house})

这将使fullData成为一个匿名类型的IQueryable,看起来像:

class anonymous
{
  Cat cat,
  House house
}

在LINQy格式中的等效代码如下:

from cat in myCats join house in myHouses
  on cat.id equals house.id
  select new {cat, house}

您还可以指定您想要选择的内容,以避免浪费:

from cat in myCats join house in myHouses
  on cat.id equals house.id
  select new {cat.id, cat.name, house.address}

5

这是因为最后一个参数 (a, b) => a 的意思是将返回结果映射到只有猫,即它是 (cat, house) => cat

您可以使用pair返回临时对象,例如:

(cat, house) => new { cat, house }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接