0

次のコードがあります。

var statements = db.statement
                .OrderByDescending(d => d.id)
                .Take(5)
                .AsEnumerable()
            .Select(d => new Statements
                             {
                                 Accounts = d.statement_entry.AsEnumerable()
                                     .GroupBy(b => b.currency)
                                     .Select(b =>
                                             new Account
                                                 {
                                                     In = b.Where(l => l.amount > 0).Sum(l => l.amount),
                                                     Out = b.Where(l => l.amount < 0).Sum(l => l.amount),
                                                     Balance = b.Sum(l => l.amount),
                                                     Currency = b.Key
                                                 }).OrderBy(b => b.Currency),
                                 UploadedDate = d.uploaded_date,
                                 Id = d.id
                             })
                .ToList();

なしでそれを行う方法はありAsEnumerable()ますか?私が理解していることから、返さAsEnumberableれる s ごとにクエリが実行されます。statement

または、コードをリファクタリングするより良い方法はありますか?

4

1 に答える 1

1

あなたは間違って理解しています。AsEnumerableクエリをローカル (クライアント) マシンで実行します。

これ

statements = db.statement
            .OrderByDescending(d => d.id)
            .Take(5)

(SQL)サーバーで実行されます。

クライアント上の残りの部分

なぜあなたは入れているのAsEnumerableですか?クエリはなくても機能するはずです(サーバー側ですべてを実行します)

唯一のことは、が実体化されてキャッシュされるように、の後OrderBy(b => b.Currency)に a を配置する必要があるということです。.ToList().Select(b => new Account

于 2012-07-17T09:08:50.543 に答える