問題は、LINQクエリが遅延(「遅延実行」)していることです。 はループでクエリの各結果にプロパティを設定するとですが、これらの結果は本質的には薄い空気に消えてしまいます。 foreach
の後にのクエリの結果を列挙すると、クエリはに再実行され、が再実行され、結果が再現され、効果的に変更が元に戻されます。クエリは単なる結果ではなく、結果を生成するための仕様であることに注意してください。
簡単な修正はになります。最初にコレクションへのクエリ。
var result = myItems.GroupBy(x => new { Id = x.Id, Name = x.Name })
.Select(x => new Report { Id = x.Key.Id, Name = x.Key.Name })
.ToList();
あなたforeach
はその後むしろ遅延クエリの結果より、メモリ内コレクションの要素を変異してしまうので、下流見えるであろう。
個人的に
しかし、クエリ自体にプロパティを設定することを検討:
var result = myItems.GroupBy(x => new { Id = x.Id, Name = x.Name })
.Select(x => new Report
{
Id = x.Key.Id,
Name = x.Key.Name,
Sales = anotherCollection.First(a => a.Id == x.KeyId)
.Sales
});
出典
2011-11-10 15:37:37
Ani
私がmyItems.ToList()を先に実行してから、ToList()を使わずにGroupBy()を実行すると、それは動作しますか、それでも依然としてクエリが再実行されますか? – Thomas
@Thomas:それは技術的にはうまくいくはずです。なぜなら、変更可能な 'Report'オブジェクトは既にその段階で作成され、実現されているからです。オブジェクトの作成ではなく、グループ分けだけが再実行されます。私はそれをしないことを強くお勧めします。 – Ani
私はmyItems.ToList()を具体化する理由は、コレクションに複数のGroupBy(この質問には含まれていない)を行い、これらのコレクションを計算に使用したいからです。私の推論は、1つのデータベースクエリを実行してから、他のGroupByのインメモリコレクションを使用することです。なぜあなたはそれをすることをお勧めしないのですか? – Thomas