多数の1対多マッピングを使用してクエリのパフォーマンスを向上させる

dapper entity-framework petapoco sql-server

質問

私はEntity FrameworkをSQL Azureに使用しています。私のアプリケーションのあるページでは、かなりの関連データをユーザーに表示しています。ページには最大30のアイテムが読み込まれていますが、各アイテムには他のオブジェクトへの5対多のマッピングがあります。クエリ時間は合理的なレベルですが、私はオブジェクトマッピング上でかなりのパフォーマンスを漏らしています。 (ほぼ完全な秒)。

私のオブジェクトがどのように見えるかの例があります

public class Task
{
    public string Name {get; set;}
    public string Status {get; set;}
    public DateTime DueDate {get; set;}
    public IEnumerable<TaskData> Data {get; set;}
    public IEnumerable<Transaction> Transactions {get; set;}
    public IEnumerable<File> Files {get; set;}
    public IEnumerable<Comment> Comments {get; set;}
    public IEnumerable<People> People {get; set;}
}

タスクには名前、ステータス、期日があります。また、カスタムの名前/値のペアである多くの TaskData、タスクの履歴、 多くのファイル、 多くのコメント、それに取り組んでいる多くの人々を示す多くのトランザクションもあります。

私のEFクエリーはこのように見えます。

var Items = context.Items.Include(x=>x.Data).Include(x=>x.Files).Include(x=>x.Comments).Include(x=>x.People).Where(some constraint).ToList();

特定のタスクの妥当性は、まずステータスに基づいており、次に期日に基づいています。そこで、ソートで使用するIComparableオーバーライドを作成しました。ポイントは、並べ替えがintまたは日付に基づいていないため、このシナリオではページングされたクエリがうまくいきません(私は正しいのですか?)

残りのアプリケーションでは、各タスクについての情報が少なくなり、Linq2Entitiesはうまく動作しています。この場合のオブジェクトマッピングは私たちを殺しています。私はDapperを使ってDBに直接向かう道を辿りましたが、1対多のマッピングには注意点があります。私はそれがうまくいくと思ういくつかの関係のために5-6のためではない。私が次に見なければならないのはPetaPocoでしたが、私は最初にここに質問を投げたほうがいいと思っていました。

あまりにも多くのデータを取り戻そうとするのは夢中ですか?これから最大のパフォーマンスを得るための私の選択肢は何ですか?アプリケーションの唯一の領域から少し複雑になります。

受け入れられた回答

私はあなたのEFクエリがあまりにも多くのデータを取り戻していると喜んで賭けています。つまり、「最適な」検索手法は、取り出されるデータの種類と量に大きく依存します。

正面を知ることで、期待するデータセットに基づいて実行するクエリを調整することができます。

例えば、あなたがサブエンティティの数が多い限られた数のエンティティだけを引っ張っているなら、ここで書いたパターンはうまくいきます:

Dapperでネストされたオブジェクトのリストをマップするには

あなたが引っ張っているIDを知っていて、2000未満の場合は、 QueryMultipleを使って1つのグリッドとクエリをクエリすることですべてを簡単に行うことができます:

cnn.QueryMultiple(@"select * from Tasks where Id in @ids 
select * from Files where TaskId in @ids
.. etc ..", new {ids = new int[] {1,2,3}});

大きなセットをヤンクしている場合は、バッチ処理が必要な場合もあれば、段階的に行う場合もあります。


あなたの特定の例では、すべてのタスクIDとデータを取得するためにTasksにクエリを行い、関連付けられたすべてのテーブルに単一のQueryMultipleを使用して関係をマップします。



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ