LINQ to Entities结合了两个IQueryable <anonymoustype> </anonymoustype>

时间:2011-08-20 01:57:23

标签: wpf entity-framework linq-to-entities

我有2个查询可以正常工作:

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,

                               });

然而,当我尝试使用union组合它们时,为了将结果输出到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>'

我似乎无法找到一种方法来完成这项工作,我们将不胜感激。

1 个答案:

答案 0 :(得分:4)

“联合”操作将相同类型的两个序列组合成一个组(即消除所有重复项)。由于您显然有两种不同类型的序列,因此您不需要联合操作。看起来你想要一个“连续”操作,它只是将两个序列链接在一​​起。你需要这样的东西:

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

但是,由于您使用的是L2E,因此您的查询将尝试在服务器上执行。由于您的服务器不允许您组合两个查询(由于类型不匹配),您需要单独执行它们,然后在客户端上连接序列:

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