C# Linq到SQL外键
数据库表的DDL: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
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,这完全是另一个问题。啊,我想我们都误读了,因为我错过了关于没有外键的部分。干杯