2011-03-22 28 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() 
      };