C# - 多个LINQ查询到一个?

时间:2011-03-22 14:58:52

标签: c# linq

我使用了两个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)

                       };

感谢。

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分: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()
             };