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

那么,我做错了吗?

你的查询不好。对于集合中的每个元素,您将枚举集合 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 回答
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 回答