1

私はこれらの2つのテーブルを持っています

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) には多くのレコードがありません。一方、Account テーブルには 300,000 を超えるレコードがあります。

クエリを高速化できる方法はありますか、またはLINQを使用するかどうかに関係なく、これをより効率的に行う別の方法はありますか?

4

2 に答える 2

1

Containsメソッドを使用して試すことができます:

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

INデータベースに対して実行される SQL クエリで句を生成する必要があります。

于 2013-04-22T18:20:48.270 に答える
1

まず、Entity Framework を使用していると仮定すると、結合を使用する必要はまったくありません。あなたは単に行うことができます:

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

ただし、データベースで別のクエリ プランが生成されるとは思いません。しかし、私の推測では、Account テーブルに AccountID のインデックスがありません (可能性は低いと思われますが)。

できることの 1 つは、ToTraceString (例: http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/4a17b992-05ca-4e3b-9910-0018e7cc9c8c/ ) を使用して SQL を取得することです。実行中です。次に、SQL Management Studio を開き、実行計画オプションをオンにして実行すると、実行計画が何であったか、およびそれを改善するために追加する必要があるインデックスが表示されます。

于 2013-04-22T18:27:31.933 に答える