0

次のような大量のデータを合計して集計するクエリがあります。

var anonType = from x in collection
               let Cars = collection.Where(c=>c.Code == "Cars")
               let Trucks = collection.Where(c=>c.Code == "Trucks")
               select new { 
                           Total = collection.Sum(v=>v.Amount),
                           CarValue = Cars.Sum(v=>v.Amout),
                           TruckValue = Trucks.Sum(v=>v.Amount),
                           CarCount = Cars.Count(),
                           TruckCount = Trucks.Count()
               };

特に使用していない場合は、範囲変数xを宣言する必要があるのは本当に奇妙だと思います。それで、私は何か間違ったことをしていますか、それとも私が従うべき別のフォーマットがありますか?

4

3 に答える 3

3

私は間違っているかもしれませんが、あなたの使用法から、あなたは集合体だけを探しているように見えるので、とにかくあなたのコレクションで伝統的なクエリ式構文クエリをしたくないと思います。あなたがそれを書いた方法では、コレクション内のアイテムごとにそれを行っているので、集約されたデータの複数のコピーをプルすることになります。必要に応じて、クエリを次のように分割できます(サンプルプロパティがスローされます)

var values = collection.Where(c => c.Code == "A");
var anonType = new
               {
                   Sum = values.Sum(v => v.Amount),
                   MinimumStartDate = values.Min(v => v.StartDate),
                   Count = values.Count()
               };
于 2010-05-19T17:04:56.687 に答える
1

ループ構造に関係なく、範囲変数を宣言します。

foreach(var x in collection)

また

for(var index = 0; index < collection.Count; index++)

また

var index = 0;

while(index < collection.Count)
{
    //...

    index++;
}

クエリも例外ではありません。変数を使用しないでください。何も害はありません。

于 2010-05-19T16:43:40.077 に答える
1

それで、私は何か間違ったことをしていますか?

あなたの質問は良くありません。コレクション内の要素ごとに、コレクションを5回列挙しています(コスト= 5 * n ^ 2)。

私が従うべき別のフォーマットはありますか?

コレクションを5回列挙することで逃げることができます(コスト= 5n)。

IEnumerable<X> cars = collection.Where(c => c.Code == "Cars");
IEnumerable<X> trucks = collection.Where(c => c.Code == "Trucks");

var myTotals = new 
{
  Total = collection.Sum(v => v.Amount),
  CarValue = cars.Sum(v => v.Amount),
  TruckValue = trucks.Sum(v => v.Amount,
  CarCount = cars.Count(),
  TruckCount = trucks.Count()
};
于 2010-05-19T19:08:47.173 に答える