多表连接优化性能
本文关键字:性能 优化 连接 | 更新日期: 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;