私はlinqが初めてで、このクエリを書き始めました:
var dProjects = Projects
.Select(p => new Models.Project {
ProjectID = p.ProjectID,
Status = p.Status,
ExpiresOn = p.ExpiresOn,
LatestComments = p.ProjectComments
.OrderByDescending(pc => pc.CreatedOn)
.Select(pc => pc.Comments)
.FirstOrDefault(),
ProjectFileIDs = p.ProjectFiles
.Select(pf => pf.BinaryFileID)
.AsQueryable()
})
.AsQueryable<Models.Project>();
関連するエンティティがネストされた選択を好み、作成するため、このクエリの実行が非常に遅いことは既にわかっていますが、機能し、必要な正しい結果が得られProjectComments
ます。ProjectFiles
このクエリを最適化して同じ結果を得るにはどうすればよいですか? 私の推測の 1 つは使用されますinner join
が、キーを介してデータベースProjectComments
にProjectFiles
既に関係があるため、関係を再度設定することで何が達成できるかわかりません。
基本的に、パフォーマンスの観点から、ここで取るべき最善のアプローチを知る必要があります。注意すべきことの 1 つは、私は並べ替えProjectComments
を行っており、最新のもののみを取得していることです。と の組み合わせを使用する必要がjoin
ありgroup by into
ますか? 助けていただければ幸いです。ありがとう。
更新しました:
申し訳ありませんが、私がやろうとしていることについて十分に明確でなかったら. 基本的に、フロント エンドには、最新のプロジェクト コメントを含むプロジェクトのリストと、プロジェクトに関連付けられているすべてのファイルのリストを表示するグリッドがあり、ユーザーはそれらのリンクをクリックして実際にそれらのドキュメントを開くことができます。したがって、上記のクエリは機能しており、グリッドに次のように表示されます。
Project ID (プロジェクト テーブルから) Status (プロジェクト テーブルから) ExpiresOn (プロジェクト テーブルから) LatestComments (プロジェクト ID を外部キーとして持つ ProjectComments テーブルからの最新のエントリ) ProjectFileIDs (プロジェクト ID を外部キーとして持つ ProjectFiles テーブルからのファイル ID のリスト) - 私はそれらのファイル ID を使用し、ユーザーがそれらのファイルを開くことができるようにリンクを作成しています)。
すべてが機能しているので、すべてセットアップしましたが、クエリは少し遅くなります。現在、データはほとんどありません (テスト データのみ) が、これが開始されると、多くのユーザー/データが予想されるため、ライブになる前に、このクエリを最適化したいと考えています。したがって、ここでの目標は基本的に最適化することです。これはネストされた選択を作成するため、これが最善のアプローチではないと確信しています。