2013-04-22 51 views
1

查询我有这两个表LINQ - 加快具有连接到一个巨大的表

ExpiredAccount     Account 
--------------     --------------- 
ExpiredAccountID     AccountID 
AccountID (fk)     AccountName 
...        ... 

基本上,我想返回显示在结果的帐户名ExpiredAccounts的列表。

我目前做到这一点使用

var expiredAccounts = (from x in ExpiredAccount 
         join m in Account on x.AccountID equals m.AccountID 
         select m.AccountName).ToList() 

这工作得很好。但是,这需要很长时间。 expiredAccounts中没有很多记录(< 200)。 另一方面的帐户表有超过300,000条记录。

无论如何,我可以加快我的查询,或者另一种方式来更有效地使用或不使用LINQ?

+2

这是linq对象还是它是一个ORM?如果它是一个ORM,那么您使用的查询提供程序是什么? – Servy 2013-04-22 18:00:01

+2

您是否有任何索引应用于(例如,“AccountID”列)基础表上? – mellamokb 2013-04-22 18:00:31

+0

@Servy提供者是'System.Data.SqlClient' @mellamokb我不是一个数据库家伙,但它说PK_Account(集群)。我不知道这是否有帮助。 – kei 2013-04-22 18:06:05

回答

1

首先,假设您使用的是实体框架,则根本不需要使用连接。你可以简单地做:

var expiredAccounts = (from x in ExpiredAccount 
         select x.Account.AccountName).ToList() 

但是,我不认为他们会在数据库上生成不同的查询计划。但我的猜测是,你没有帐户表中的AccountID索引(尽管这似乎不太可能)。

您可以做的一件事就是使用ToTraceString(例如:http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/4a17b992-05ca-4e3b-9910-0018e7cc9c8c/)来获取正在运行的SQL。然后,您可以打开SQL Management Studio并在启动执行计划选项的情况下运行它,它将向您显示执行计划的内容以及需要添加哪些索引才能使其更好。

+0

修改”ExpiredAccount“模型以具有虚拟”Account“属性后,此工作非常顺利!加载时间急剧变化。谢谢。 – kei 2013-04-22 19:42:19

1

您可以尝试使用Contains方法:

var expiredAccounts = (from m in Account where ExpiredAccount.Select(x => x.AccountId) 
                  .Contains(m.AccountId) 
         select m.AccountName).ToList() 

应该产生将要执行agains数据库SQL查询IN条款。

+0

谢谢,但我已经尝试过这一点,我不认为它没有加入就可以工作。 '无法创建类型为'ExpiredAccount'的常量值。只有原始类型('Int32,String和Guid')在此上下文中受支持。“ – kei 2013-04-22 19:33:36