Linq to SQL外键

时间:2008-11-12 05:07:13

标签: 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

我使用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条记录,但我的查询正确返回两条记录。

我很幸运,或者是那个告诉我我错了的人?

3 个答案:

答案 0 :(得分:2)

那会有效。这是正常的,因为第二个“来自”询问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
            };

答案 1 :(得分:2)

杰森 - 我错过了你使用内置的Linq to SQL关系的事实。很抱歉对于这个误会;在正常情况下,你在这里建议的工作会很好。

答案 2 :(得分:0)

这对我来说很好,我不确定为什么会创建一个交叉连接

相关问题