2011-08-20 49 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