Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C-将多个LINQ查询合并为一个?_C#_Linq - Fatal编程技术网

C# C-将多个LINQ查询合并为一个?

C# C-将多个LINQ查询合并为一个?,c#,linq,C#,Linq,我使用了两个LINQ查询来操作datatable并返回所需的数据。实际上,该表包含以下列: Group Animal Numbers 一个组中可以有多个动物,并且可以为一个动物分配多个编号。首先,我想计算每个特定动物的数字范围,然后计算每组的平均范围。输出是组号,然后是平均范围 我有以下两个LINQ查询,它们确实可以工作,但是我的问题是,这可以合并到一个查询中吗?或者,由于它们是不同的操作,它们是否应该在可读性和可测试性方面保持分离 //Calculate range/delt

我使用了两个LINQ查询来操作datatable并返回所需的数据。实际上,该表包含以下列:

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)

                       };

谢谢。

因为您没有强制第一个查询使用ToArray之类的方法进行计算,所以组合这些查询没有任何好处。为了可读性,我会将它们分开。

因为您没有强制第一个查询使用ToArray这样的方法进行计算,所以组合这些查询没有任何好处。为了便于阅读,我将它们分开。

您可以先按组对数据进行分组,然后在嵌套查询中按动物对数据进行分组,以计算delta的平均值:

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()
             };

您可以先按组对数据进行分组,然后在嵌套查询中按动物对数据进行分组,以计算Delta的平均值:

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()
             };

实际上,他是通过在第一个查询中调用AsEnumerable来强制查询求值的。AsEnumerable不强制查询求值。你链接到的文章备注部分的最后一句话很重要。True,调用AsEnumerable不会立即枚举数据实体。但是,它会影响使用组的哪个实现,表还是IEnumerable。这会对最终评估时生成的SQL产生巨大影响。例如,不会在服务器端对where进行评估。将使用Linq-to-Objects检索所有实体,并执行where。实际上,他是通过在第一个查询中调用AsEnumerable来强制查询求值。AsEnumerable不会强制查询求值。你链接到的文章备注部分的最后一句话很重要。True,调用AsEnumerable不会立即枚举数据实体。但是,它会影响使用组的哪个实现,表还是IEnumerable。这会对最终评估时生成的SQL产生巨大影响。例如,不会在服务器端对where进行评估。将使用Linq to对象检索所有实体,并在何处执行操作。