C# Linq到SQL外键

C# Linq到SQL外键,c#,sql,visual-studio-2008,linq-to-sql,C#,Sql,Visual Studio 2008,Linq To Sql,数据库表的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 我在VisualStudio

数据库表的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
我在VisualStudio2008中使用LINQtoSQL设计器创建了一个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条记录,但我的查询正确地返回了这两条记录


我是幸运的,还是告诉我我错了的人感到困惑?

这对我来说很好,我不知道为什么会创建一个交叉连接,它会起作用。这很正常,因为第二个“发件人”查询PC的用户集,第三个“发件人”查询PC的应用程序集。我猜这不会生成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
            };

Jason-我忽略了一个事实,即您正在使用内置的Linq到SQL关系。对不起,误会了;在正常情况下,您在这里提出的建议会很有效。

谢谢Glenn。很晚了,只是想确定我没有疯。在有人问之前。。。“异常情况”是另一个线程中的OP表示他没有使用FKs,这完全是另一个问题。啊,我想我们都误读了,因为我错过了关于没有外键的部分。干杯