使用Linq to SQL连接多个一对多表

时间:2010-11-18 10:47:47

标签: linq linq-to-sql

我想在这里加入3个表是对它们的简要总结

用户 - id,name,.....

contactdetails - id,detail,...., userId

地址 - id,地址,....... contactdetailsId

如何将这3个表与linq连接到sql?

2 个答案:

答案 0 :(得分:1)

写一些类似的东西(我无法从你的问题中读出数据库的整个结构):

var q = from a in ctx.address
select new {
    a.address,
    a.concactdetails.detail,
    a.contactdetils.user.name
};

当具有一对多关系时,最容易将查询基于“最多”的表。可以反过来使用LoadWith选项。不幸的是,linq-to-sql只支持在完成这种方式时将两个表转换为高效的查询。如果您使用三个表进行尝试,您将获得大量的小读取 - 一行查询,从而严重降低数据库拖动性能(请参阅http://coding.abel.nu/2011/11/always-check-generated-sql/示例)。

答案 1 :(得分:0)

        ContactDetail[] ContactDetails = new ContactDetail[0]; // your contact detail entries
        Address[] Addresses = new Address[0]; // your address entries
        User[] Users = new User[0]; // your user entries
        Users.Join(ContactDetails, user => user.ID, cd => cd.ID, (user, cd) => new { User = user, ContactDetail = cd }).Join(Addresses, UserAndCD => UserAndCD.ContactDetail.ID, address=>address.ContactDetailID, (UserAndCD, address)=> new {User = UserAndCD.User, ContactDetail = UserAndCD.ContactDetail, Address = address});

在这种情况下,您将获得user-contactdetail-address条目。如果您希望获得具有contactdetail枚举的用户以及每个contactdetail的地址枚举,那么您必须使用GroupJoin: