2011-03-22 30 views
1

我已经使用了两个LINQ查询来处理数据表并返回我想要的数据。实际上,该表具有以下列:C# - 多个LINQ查询到一个?

Group Animal  Numbers 

在单个组内可以有多个动物,并且可以将多个数字分配给单个动物。最初我想计算每个特定动物的数字范围,然后计算每个组的平均范围。输出是组号,然后是平均范围。

我有以下两个LINQ查询,可以工作,但是我的问题是,这可以合并为单个查询,还是因为它们是不同的操作,它们是否应该单独保持可读性和可测试性?

//Calculate range/delta for each number per animal 
     var query = from data in Data.AsEnumerable() 
        group data by new { animal = data.Field<string>("animal"), gp = data.Field<string>("group") } 
         into g 
         orderby g.Key.gp 
         select new 
         { 
          animal = g.Key.animal, 
          gp = g.Key.gp, 
          delta = g.Max(c => Convert.ToDouble(c.Field<string>("numbers"))) 
            - g.Min(c => Convert.ToDouble(c.Field<string>("numbers"))) 

         }; 

     //calculate average range/delta per group 
     var temp = from q in query 
        group q by q.gp 
         into g 
         select new 
         { 
          gp = g.Key, 
          average = g.Average(c => c.delta) 

         }; 

谢谢。

回答

5

因为您不强制第一个查询使用类似ToArray()的方法进行评估,所以组合这些查询没有任何优势。为了便于阅读,我会将它们分开。

+0

其实他是迫使查询通过调用'AsEnumerable进行评估( )'在第一个查询中。 – 2011-03-22 15:09:26

+1

'AsEnumerable'不强制查询评估。 neontapir 2011-03-22 15:13:19

+1

您链接到的文章中备注部分的最后一句很重要。当然,调用'AsEnumerable()'并不是直接枚举'Data'实体。但是,它确实影响使用“组”的实现,表 vs IEnumerable 。这可能会对最终评估时生成的SQL产生巨大影响。例如,在服务器端不会评估“where”。所有实体都将被检索,并且使用Linq-to-Objects来完成“where”。 – 2011-03-22 16:09:34

0

,你可以第一组由group,然后在嵌套查询,通过animal计算增量的平均数据:

var result = from data in Data.AsEnumerable() 
      group data by data.Field<string>("group") into g 
      select new 
      { 
       gp = g.Key, 
       average = (
        from item in g 
        group item by data.Field<string>("animal") into f 
        select f.Max(c => double.Parse(c.Field<string>("numbers"))) 
          - f.Min(c => double.Parse(c.Field<string>("numbers"))) 
       ).Average() 
      };