エンティティ フレームワークに、外部キーである列でグループ化する 2 つの非常に単純なクエリがあります。つまり、テーブル フィールドは次のとおりです。
pk : Primary key
name : name of object
f1: foreign key1
f2: foreign key2
...
特に次のようなタイムアウト例外が発生します。
Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
クエリは次のとおりです。
var q = from x in db.Table select x;
var query_1 = q.GroupBy (record => record.f1);
var query2 = q.GroupBy(record => new {record.f1, record.f2});
DB に約 30,000 のレコードがあり、単純な group by がタイムアウトする理由がわかりません。私が何をすべきかについて何か提案はありますか?私はEntity Framework 4.1を使用しているので、データベースを実装から抽象化したいので、dbエンジン自体を何も変更しないソリューションが必要です。f1 または f2 (または両方) フィールドにインデックスを付けると、より高速なクエリを取得できますか? もしそうなら、誰かがインデックス作成の概念と、Enfity フレームワークでの方法を説明してもらえますか? タイムアウトを増やすことが解決すべき唯一の解決策になるとは思いません。より多くのデータが来ると問題が残るのではないかと心配しています。
編集:ここでEF移行について言及されていることを試しました
私は結果としてこのクラスを持っています:
namespace DataAccessLayer.Migrations
{
using System;
using System.Data.Entity.Migrations;
public partial class IX_Table1_fId : DbMigration
{
public override void Up()
{
Console.WriteLine("Creating Index");
CreateIndex("Table1", "fId");
Console.WriteLine("Index Created");
}
public override void Down()
{
DropIndex("Table1", "IX_Table1_fId");
}
}
}
しかし、このコードはいつ呼び出されるのでしょうか? コンソールにある印刷ステートメントが表示されません。