エンティティフレームワークをよりよく理解し、データベースを照会するためのバックエンドデバイスとして効果的に使用できるようにするため、Entity Frameworkをテストしました。エンティティフレームワークのパフォーマンスを向上させるクエリ
参考までに、Entity Frameworkはデフォルトで遅延読み込みを使用しています。私が作成しようとしているようなバックエンドシステムの場合、これは有用ではありません。
int x = 0;
using (SandboxContext dbc = new SandboxContext()) {
var customers = (from c in dbc.Customer orderby c.AcctNumber select new { c.CustomerKey, c.AcctNumber }).ToList();
var products = (from p in dbc.Product orderby p.CustomerKey select new { p.CustomerKey }).ToList();
foreach (var c in customers)
foreach (var p in products.Where(s => s.CustomerKey == c.CustomerKey))
++x;
dbc.Dispose();
}
return x;
これは現在使用しているコードと同じです。
私が試したことはすべて、このメソッドのパフォーマンスを悪化させるように思えます。参考までに、このコードはマシン上で約5秒間実行され、約22000個の自動生成データが返されます。このコードは、他の一方で、同じ結果をほぼ瞬時に実行されます。
SqlConnection sqlc = new SqlConnection(sqlConnectString);
SqlDataAdapter sqlda = new SqlDataAdapter("SELECT customerkey, acctnumber FROM customers", sqlc);
DataTable dtCustomers = new DataTable(), dtProducts = new DataTable();
sqlda.Fill(dtCustomers);
sqlda.SelectCommand.CommandText = "SELECT customerkey FROM product";
sqlda.Fill(dtProducts);
sqlda.Dispose();
sqlc.Close();
DataView dvCustomers = new DataView(dtCustomers) { Sort = "AcctNumber" };
DataView dvProducts = new DataView(dtProducts) { Sort = "CustomerKey" };
int x = 0;
for (int y = 0; y < 1000; y++)
foreach (DataRowView drvCustomers in dvCustomers) {
DataRowView[] drvaProducts = dvProducts.FindRows(drvCustomers["customerkey"].ToString());
foreach (DataRowView drvProducts in drvaProducts)
++x;
}
return x;
は、私がこれまでEntity Frameworkのコードの清潔さと読みやすさを好むが、私はかなりだ情報の一部の重要な部分が欠けてると思います私の方法のスピードを傷つける。少なくとも、DataTable/DataView/DataRowView実装の速度に近づくようにEntity Frameworkコードを改善する考えはありますか?
? – dotctor
モデルに必要なすべての往復プロパティがある場合(つまり、 'Customer'に' Product'のコレクションがあります)、あなたがしようとしているのは 'dbc.Customer.SelectMany(c => c。製品).Count() '。あなたの 'Customer'が' Product'のコレクションを持っていない場合は、これを設定することを検討してください。これがなければ、EFの良さを逃してしまうでしょう。 – spender
最初に、SQLを構築するために使用されるモデルを構築するEFのウォームアップコストがあります。 https://msdn.microsoft.com/en-us/library/bb896240(v=vs.100).aspx次に、データベースを2回ヒットします。それを防ぐために将来のクエリを使用することができます。 https://lostechies.com/jimmybogard/2014/03/11/efficient-querying-with-linq-automapper-and-future-queries/ –