我有这两个表
ExpiredAccount Account
-------------- ---------------
ExpiredAccountID AccountID
AccountID (fk) AccountName
... ...
基本上,我想返回结果中显示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更有效地做到这一点吗?
答案 0 :(得分:1)
您可以尝试使用Contains
方法:
var expiredAccounts = (from m in Account where ExpiredAccount.Select(x => x.AccountId)
.Contains(m.AccountId)
select m.AccountName).ToList()
它应该在SQL查询中生成IN
子句,该子句将再次执行数据库。
答案 1 :(得分:1)
首先,假设您正在使用实体框架,则根本不需要使用连接。你可以这样做:
var expiredAccounts = (from x in ExpiredAccount
select x.Account.AccountName).ToList()
但是,我认为他们不会在数据库上生成不同的查询计划。但我的猜测是你在Account表中没有AccountID的索引(虽然这似乎不太可能)。
您可以做的一件事是使用ToTraceString(例如:http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/4a17b992-05ca-4e3b-9910-0018e7cc9c8c/)来获取正在运行的SQL。然后,您可以打开SQL Management Studio并在启用执行计划选项的情况下运行它,它将显示执行计划是什么以及需要添加哪些索引才能使其更好。