Как выполнить агрегацию без «группировки по» в Linq? - PullRequest
0 голосов
/ 18 ноября 2008

Все, что я могу найти в linq для агрегации, содержит предложение "group by". Как бы я написал этот запрос в LINQ? У меня есть список пар дата-значение, и я хочу взять среднее значение:

SELECT AVG(MySuff.Value) AS AvgValue FROM MyStuff

Ответы [ 6 ]

4 голосов
/ 18 ноября 2008

Утренний Алан:

int count = (from a in myContext.MyStuff
            select a).Count();

Предполагая, что myContext является DataContext.

Обратите внимание, что это дает вам немедленное выполнение, что вы можете не хотеть.

Вместо этого вы можете сохранить результаты запроса в переменной:

var allResults = from a in myContext.MyStuff
                 select a;

//sometime later when needed
int count = allResults.Count(); // executes the SQL query now!
2 голосов
/ 18 ноября 2008

В LINQ множество операторов агрегирования без группировки. Ответ Алана показывает вам оператор Count, но MSDN перечисляет других .

РЕДАКТИРОВАТЬ: увидев ваше редактирование, похоже, вы хотите оператор Среднее .

1 голос
/ 20 ноября 2008

Немного сортировщик

pairs.Average(a=>a.Value)   

Если нет объединения, группировки или разрешения, выражения запросов (из ...), на мой взгляд, не стоят.

1 голос
/ 18 ноября 2008

Ответ на модифицированный пример (я полагаю):

var average = (from a in MyStuff
              select a.Value).Average();
1 голос
/ 18 ноября 2008

Следует отметить, что код LINQ Алана будет давать именно SQL-код AlanR, несмотря на тот факт, что вы можете догадаться иначе.

Однако следует соблюдать осторожность. Если бы это было написано как:

var q = from a in MyStuff select a;
int count = q.count();
foreach(MyStuff m in q) {...}

Затем будут сгенерированы два запроса к БД: первый как «select count (*) ...», а второй как «select * ....»

0 голосов
/ 18 ноября 2008

Спасибо всем за помощь. Вот то, на чем я остановился, что работает.

(from s in series select s).Average( a => a.Value )

С уважением, Алан ... R

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...