Linq to SQL lambda join

Nib*_*Pig 8 c# linq-to-sql

遇到这个问题,我尝试了几个例子,但我只是没有得到它.使用非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....

  • 感谢您使用比`foo`和`bar`更多上下文的变量. (9认同)

Dan*_*rth 6

问题是,你的连接结果 - 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)


Rup*_*Rup 5

那是因为最终的参数(a, b) => a意味着只将结果映射到猫,即它(cat, house) => cat

您可以返回一对临时对象,例如

(cat, house) => new { cat, house }
Run Code Online (Sandbox Code Playgroud)


Jon*_*nna 5

您需要定义要从中选择的内容.

您可以将后者更改为:

var fullData = myCats.Join(myHouses, cat => cat.id, house => house.id, (cat, house) => new {cat, house})
Run Code Online (Sandbox Code Playgroud)

这将使fullDataIQueryable的匿名类型看起来像:

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)