2011-08-20 44 views
2

我有2個查詢其做工精細:LINQ到實體合併兩個IQueryable的<AnonymousType>

var q = (from c in _context.Wxlogs 

       where (SqlFunctions.DatePart("Month", c.LogDate2) == m3) && (SqlFunctions.DatePart("Year", c.LogDate2) == y1) 
       group c by c.LogDate2 
       into g 
       orderby g.Key 
       let maxTemp = g.Max(c => c.Temp) 
       let minTemp = g.Min(c => c.Temp) 
       let maxHum = g.Max(c => c.Humidity) 
       let minHum = g.Min(c => c.Humidity) 

       select new 
          { 
           LogDate = g.Key, 
           MaxTemp = maxTemp, 
           MaxTempTime = g.FirstOrDefault(c => c.Temp == maxTemp).LogTime, 
           MinTemp = minTemp, 
           MinTempTime = g.FirstOrDefault(c => c.Temp == minTemp).LogTime, 
           MaxHum = maxHum, 
           MaxHumTime = g.FirstOrDefault(c => c.Humidity == maxHum).LogTime, 
           MinHum = minHum, 
           MinHumTime = g.FirstOrDefault(c => c.Humidity == minHum).LogTime, 
          }); 

var r = (from c in _context.Wxlogs 
       where 
        (SqlFunctions.DatePart("Month", c.LogDate2) == m3) && 
        (SqlFunctions.DatePart("Year", c.LogDate2) == y1) 
       group c by c.LogDate2 
        into g 
        orderby g.Key 
        let maxDew = g.Max(c => c.Dew_Point) 
        let minDew = g.Min(c => c.Dew_Point) 
        //let maxWind = g.Max(c=> c.Wind_Gust) 
        let maxRainRate = g.Max(c => c.Rain_rate_now) 
        let maxPres = g.Max(c => c.Barometer) 
        let minPres = g.Min(c => c.Barometer) 

        select new 
           { 
            LogDate = g.Key, 
            MaxRainRateTime = g.FirstOrDefault(c => c.Rain_rate_now == maxRainRate).LogTime, 
            MaxPres = maxPres, 
            MaxPresTime = g.FirstOrDefault(c => c.Barometer == maxPres).LogTime, 
            MinPres = minPres, 
            MinPresTime = g.FirstOrDefault(c => c.Barometer == minPres).LogTime, 
            MinDew = minDew, 
            MinDewTime = g.FirstOrDefault(c => c.Dew_Point == minDew).LogTime, 
            MaxDew = maxDew, 
            MaxDewTime = g.FirstOrDefault(c => c.Dew_Point == maxDew).LogTime, 
            MaxRainRate = maxRainRate, 

           }); 
然而

,當我嘗試給他們使用聯合的結果結合起來,以輸出到WPF datgrid:

var result = r.Union(q); 

以下錯誤拋出的工會:

Error 1 Instance argument: cannot convert from 'System.Linq.IQueryable<AnonymousType#1>' to 'System.Linq.ParallelQuery<AnonymousType#2>' 

我似乎無法找到一種方法,使這項工作和任何幫助將不勝感激。

+0

由於union操作在這裏沒有意義,你能解釋一下你期望從代碼中得到什麼嗎? – Gabe

+0

我最初有這個作爲一個長查詢,它通過結果通過ToList()傳遞給WPF數據網格。但是,我不斷得到OutofMemory異常錯誤,直到查詢被拆分。 – Corretto

+0

在這裏等一下。你真的想要做一個「加入」操作嗎? – Gabe

回答

4

「聯合」操作將相同類型的兩個序列組合成單個集合(即,消除所有副本)。既然你明顯有兩種不同類型的序列,你不需要聯合操作。它看起來像你想要一個「concat」操作,它只是將兩個序列鏈接在一​​起。你需要的東西,如:

var result = r.Concat<object>(q); 

但是,由於您使用L2E,您的查詢將嘗試獲取服務器上執行。因爲您的服務器不會允許您將合併這兩個查詢(由於不匹配的類型),你需要單獨再執行它們CONCAT客戶端上的序列:

var result = r.AsEnumerable().Concat<object>(q.AsEnumerable()); 

採用AsEnumerable()運行在查詢服務器並將結果提供給客戶端。

因爲事實證明,要序列結合彼此相鄰(即使用您的網格相同的行,但另一組列),你真正想要一個join操作:

var result = from rrow in r.AsEnumerable() 
      join qrow in q.AsEnumerable() on rrow.LogDate equals qrow.LogDate 
      select new { rrow.LogDate, 
          rrow.MaxTemp, rrow.MaxTempTime, 
          rrow.MinTemp, rrow.MinTempTime, 
          rrow.MaxHum, rrow.MaxHumTime, 
          rrow.MinHum, rrow.MinHumTime, 
          qrow.MaxRainRate, qrow.MaxRainRateTime, 
          qrow.MaxPres, qrow.MaxPresTime, 
          qrow.MinPres, qrow.MinPresTime, 
          qrow.MaxDew, qrow.MaxDewTime, 
          qrow.MinDew, qrow.MinDewTime }; 
+0

謝謝你。我曾嘗試Concat,但得到了上述相同的錯誤。你的答案編譯,但在運行時拋出一個錯誤。 Message = DbUnionAllExpression需要具有兼容集合ResultTypes的參數 – Corretto

+0

工作原理非常感謝,不過現在我得到了兩個單獨的列表,這些列表已加入。例如我得到兩次日期,一次是第一組數據,一次是第二組數據。目的是用所有數據獲得一次日期。 – Corretto

+0

謝謝!這是輝煌&完美的作品(只需要交換左右搖擺)。 – Corretto