多表连接优化性能

本文关键字:性能 优化 连接 | 更新日期: 2023-09-27 18:12:06

我有一个项目,它使用带有用户和联系人表的数据库。如下图所示:

UserTable:
    UserID     FirstName     LastName
    1          John          Smith
    2          Ted           Raimi
    3          Brian          Park
ContactTable:
    ContactID     UserID     ContactType   PhoneNum
    1             1          Home          5555555555
    2             1          Work          4444444444
    3             2          Home          3333333333

和此表的样例右连接将为

UserID     FirstName     ContactID     ContactType   PhoneNum
1          John          1             Home          5555555555
1          John          2             Work          4444444444
2          Ted           3             Home          3333333333
3          Brian                     

我的c#业务对象看起来像:

public class User
{
     public int UserID{get;set;}
     public string FirstName{get;set;}
     public string LastName{get;set;}
     public IEnumerable<Contact> Contacts {get;set;}
}
public class Contact
{
     public int ContactID{get;set;}
     public int UserID{get;set;}
     public string ContactType{get;set;}
     public string PhoneNum{get;set;}
}
所以我的问题是:组合这些数据的最佳方法是什么?是否

1)通过SQL做,也许使用PIVOT或CONCAT将John Smiths合并为1行,然后从数据表输出管理,以适应我的对象?这意味着输出可能如下所示:

UserID     FirstName     HomePhoneNum     WorkPhoneNum
1          John          5555555555       4444444444
2          Ted           3333333333
3          Brian       

这样会丢失数据(contactID),并且缩放

会很痛苦

2)使多个SQL调用而不是仅仅一个?当我制作"用户"列表时,我也必须制作"联系人"列表,然后通过代码将它们连接起来?

3)只使用一个SQL调用,原始的右连接,并通过LINQ善良做一个选择不同的用户,并使用适用的行来填写它的联系数据?

我倾向于第2点,但我想确保我没有错过另一个选择。我觉得让SQL语句变得更复杂(第1条)是个坏主意,但是我担心当用户表变大时第2条和第3条的处理时间。有人对未来的最佳路径有什么建议吗?

多表连接优化性能

我想知道你为什么要合并数据。

在你的类中已经有了一个IEnumerable<Contact> Contacts属性。

你只需要在LINQ调用中使用include方法。

var lUsers = from usr in dbcontext.User.Include(t => t.Contacts)
             select usr;