2

SQLAzureにEntityFrameworkを使用しており、アプリケーションの1ページに、かなりの量の関連データをユーザーに表示しています。ページに最大30個のアイテムを読み込んでいますが、各アイテムには、他のオブジェクトへの5つの1対多のマッピングがあります。クエリ時間は妥当なレベルですが、オブジェクトマッピングでかなりのパフォーマンスがリークしています。(ほぼ1秒)。

これが私のオブジェクトがどのように見えるかの例です

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();

特定のタスクの関連性は、最初にステータスに基づいており、次に期日に基づいています。そこで、sortで使用するIComparableオーバーライドを作成しました。重要なのは、ソートがintまたはdateに基づいていないため、このシナリオではページングされたクエリがうまく機能しないということです(私は正しいですか?)

アプリケーションの残りの部分では、各タスクに関する情報をあまり表示せず、Linq2Entitiesは正常に機能しています。ただし、この場合のオブジェクトマッピングは私たちを殺しています。私はDapperを使用してDBに直接アクセスする道を進んできましたが、1対多のマッピングには注意が必要です。いくつかの関係については、うまくいくと思いますが、5-6ではうまくいきません。次に見るのはPetaPocoでしたが、最初にここに質問を投げたほうがいいと思うまで、それほど遠くはありませんでした。

大量のデータを取り戻そうとすることに夢中ですか?これから最大のパフォーマンスを得るための私のオプションは何ですか?アプリケーションの1つの領域しかないため、少し複雑にします。

4

1 に答える 1

2

私はあなたのEFクエリがあまりにも多くのデータを引き戻しているに違いない。重要なのは、「最適な」検索手法は、プルされるデータのタイプと量に大きく依存するということです。

事前に知っていると、予想されるデータセットに基づいて実行するクエリを調整できます。

たとえば...多くのサブエンティティを持つ限られた数のエンティティのみをプルしている場合、ここで書いたパターンはうまく機能します:

ネストされたオブジェクトのリストをDapperでマップするにはどうすればよいですか

プルしているIDがわかっていて、2000未満の場合は、単一のグリッドにクエリを実行し、次のようにマッピングすることで、すべてをショートカットできますQueryMultiple

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

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


特定の例では、クエリTasksを実行してすべてのタスクIDとデータを取得し、単一QueryMultipleの関連テーブルを使用してリレーションにマップします。

于 2011-09-26T06:17:37.817 に答える