LINQ to Entities объединяет два IQueryable <AnonymousType> - PullRequest
2 голосов
/ 20 августа 2011

У меня есть 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,

                               });

однако, когда я пытаюсь объединить их, используя объединение, для вывода результатов в таблицу данных WPF:

var result = r.Union(q);

следующая ошибка выдается на объединение:

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

Я не могу найти способ сделать эту работу, и любая помощь будет оценена.

1 Ответ

4 голосов
/ 20 августа 2011

Операция «объединение» объединяет две последовательности типа одинакового в один набор (т.е. удаляет все дубликаты).Поскольку у вас явно есть последовательности двух разных типов, вам не нужна операция объединения.Похоже, вам нужна операция «concat», которая объединяет две последовательности в одну.Вам нужно что-то вроде:

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 };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...