数据库表的DDL:
Users: id - int - identity name - varchar - unique PCs: id - int - idnetity name - varchar - unique userid - FK to Users Apps: id - int - identity name - varchar pcid - FK to PCs
我在Visual Studio 2008中使用Linq To SQL设计器创建了一个DataContext。
我要执行此查询:
select users.name, pcs.name, apps.name from users u join pcs p on p.userid = u.id join apps a on a.pcid = p.id
在另一个线程中告诉我,我在该线程中发布了一个答案,以下内容不正确,并且创建了交叉联接。
var query = from u in db.Users // gets all users from p in u.PCs // gets all pcs for user from a in p.Apps // gets all apps for pc select new { username = u.Name, pcname = p.Name, appname = a.Name };
当我执行此查询时,我得到正确的结果。在每个表中有两个记录的交叉联接应返回8个记录,但是我的查询正确地返回了两个记录。
我很幸运,还是那个人告诉我我错了吗?
那可行。这是正常现象,因为第二个“ from”查询个人计算机的用户组,第三个“ from”询问个人计算机的应用程序组。而且我想这不会像T- Sql那样产生交叉联接,因为条件已经在外键和关联中定义了。
但是我想这应该是内部联接所要的语法。
var query = from u in db.Users join p in db.PCs on p.UserId == u.Id join a in db.Apps on a.PCId == p.Id select new { username = u.Name, pcname = p.Name, appname = a.Name };