代码之家  ›  专栏  ›  技术社区  ›  itchi

如果我使用LINQ进行投影,而不使用范围变量,那么正确的语法是什么?

  •  0
  • itchi  · 技术社区  · 15 年前

    我有一个查询,它对大量数据进行汇总和聚合,如下所示:

    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,特别是如果我不使用它。那么,我是在做错误的事情,还是有一个不同的格式我应该遵循?

    3 回复  |  直到 15 年前
        1
  •  3
  •   Anthony Pegram    15 年前

    我可能是错的,但是从您的用法来看,我认为您无论如何都不想用您的集合执行传统的查询表达式语法查询,因为您似乎只是在寻找聚合。按照您编写它的方式,您将提取聚合数据的多个副本,因为您正在执行此操作 对于集合中的每个项 . 如果愿意,可以这样拆分查询(抛出示例属性)

    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()
                   };
    
        2
  •  1
  •   Bryan Watts    15 年前

    无论循环结构如何,都要声明一个范围变量:

    foreach(var x in collection)
    

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

    var index = 0;
    
    while(index < collection.Count)
    {
        //...
    
        index++;
    }
    

    查询没有什么不同。只是不要使用变量,它不会伤害任何东西。

        3
  •  1
  •   Amy B    15 年前

    那么,我做错什么了吗?

    你的询问不好。对于集合中的每个元素,您要枚举集合5次(cost=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()
    };