1

これが適切な質問であるかどうかはよくわかりませんが、試してみて、どのような回答が表示されるかを確認します。

私たちは開発の段階でユーザー受け入れテストに進んでいます。ユーザーが少し不足していることがわかったのは、検索結果が選択された後のタブの読み込み速度でした。私はロギングメソッドを実装し、知覚される速度低下の原因となっているメソッドとデータの取得/操作に関していくつかの原因を考え出しました。以下が最大の問題です。このメソッドの目的は、ポリシーまたはサブポリシーに対して受け取ったすべての支払いを選択し、それらを期日と支払い日の両方でグループ化してから、ポリシー全体に対して支払われた金額を合計するGroupedClassを返すことです。これをもっと効率的にする方法はないかと思います。この古いUniVerseデータを操作すると、キャストしないと壊れがちになることに気づきました。

var mc = new ModelContext();
var policy = mc.Polmasts.Find("N345348");
        var payments =
            mc.Paymnts.Where(p => p.POLICY.Contains(policy.ID)).GroupBy(p => new { p.PAYDUE_, p.PAYPD_ }).Select(
                    grp =>
                    new GroupedPayments
                        {
                            PAYPD_ = grp.Key.PAYPD_,
                            PAYDUE_ = grp.Key.PAYDUE_,
                            AMOUNT = grp.Sum(a => a.AMOUNT),
                            SUSP = grp.Sum(a => a.SUSP)
                        }).AsEnumerable().OrderByDescending(g => g.PAYDUE_).Take(3);
4

2 に答える 2

2

この古いUniVerseデータを.AsEnumerable()使用すると、使用する前にキャストしないと壊れがちになることに気づきました。

これはあなたの問題の根本に行きます。と言うことで、最初の3つを並べ替えて取得する前に、その時点でシーケンス内のすべてのAsEnumerableレコードを強制的に停止することになります。明らかに、これはより多くのデータに対してますます遅くなります。

あなたの言うことを考えると、これを修正するのは難しいかもしれません。一般に、LINQプロバイダーは、サーバーで評価できるものとできないものに関して、さまざまな量の機能を提供します。上記のコメントから、LINQ-to-UniVerseはサーバー上での処理が特にうまく機能していないようです。

たとえば、優れたデータベースLINQプロバイダーが(作成された定義を使用して)実行できることを期待します。

context.Products.Where(p => p.Type == 4).OrderBy(p => p.Name)

サーバー上; ただし、上記のコードはより負担がかかります。それをより小さな部分に分割し、サーバーにソートとを実行させることが可能かどうかを確認してみてくださいTake(3)。最善の方法は、1つのクエリ(サーバーで実行可能PAYDUE_)を使用して下位3つの値を取得し、次に別のクエリを実行してそれらの日付の金額を実際に取得し、関連するすべてのレコードをクライアントに取得することです。

于 2012-09-18T08:16:34.010 に答える
0

SQL Serverに対して実行していると仮定すると、プロファイリングを有効にしますが、Linqには、希望するSQLを生成しないという習慣があります。速度低下は、メモリ操作よりもSQLの不良による可能性がはるかに高くなります。

于 2012-09-17T16:49:22.777 に答える