遇到这个问题,我尝试了几个例子,但我只是没有得到它.使用非lambda方式非常有意义,但如何使用lambda表达式进行连接?
var myCats = GetAllCats();
var myHouses = GetAllHouses();
// pseudosql: select * from a inner join b on a.id = b.id
Run Code Online (Sandbox Code Playgroud)
我试过这个:
var fullData = myCats.Join(myHouses, a => a.id, b => b.id, (a, b) => a);
Run Code Online (Sandbox Code Playgroud)
我通过查看SO上的其他示例得到了什么,但是fullData是类型IEnumerable<Cat>
所以我不能从Houses中提取任何属性.
Fem*_*ref 30
var fullData = myCats.Join(
myHouses,
cat => cat.id,
house => house.id,
(cat, house) =>
new
{
Cat = cat,
House = house
});
Run Code Online (Sandbox Code Playgroud)
通过fullData.First().Cat...
或访问fullData.First().House...
.
问题是,你的连接结果 - Join方法的最后一个参数 - 是a Cat
,这就是为什么fullData
是类型的原因IEnumerable<Cat>
.如果要同时访问这两者,请返回匿名类型:
var fullData = myCats.Join(myHouses, a => a.id,
b => b.id,
(a, b) => new { Cat = a, House = b});
Run Code Online (Sandbox Code Playgroud)
那是因为最终的参数(a, b) => a
意味着只将结果映射到猫,即它(cat, house) => cat
您可以返回一对临时对象,例如
(cat, house) => new { cat, house }
Run Code Online (Sandbox Code Playgroud)
您需要定义要从中选择的内容.
您可以将后者更改为:
var fullData = myCats.Join(myHouses, cat => cat.id, house => house.id, (cat, house) => new {cat, house})
Run Code Online (Sandbox Code Playgroud)
这将使fullData
IQueryable的匿名类型看起来像:
class anonymous
{
Cat cat,
House house
}
Run Code Online (Sandbox Code Playgroud)
LINQy格式的等价物是:
from cat in myCats join house in myHouses
on cat.id equals house.id
select new {cat, house}
Run Code Online (Sandbox Code Playgroud)
您还可以指定要选择的内容,以避免浪费:
from cat in myCats join house in myHouses
on cat.id equals house.id
select new {cat.id, cat.name, house.address}
Run Code Online (Sandbox Code Playgroud)