При использовании следующего синтаксиса:
select new { Tag = ..., Count = ... };
Вы создаете анонимный тип . Компилятор генерирует имя этого типа для вас во время компиляции, поэтому вы не сможете узнать, что это такое.
Когда вы вызываете ToList для запроса, который выбирает экземпляры этого анонимного типа, возможно, что вы можете вернуть список, потому что List реализует некоторые неуниверсальные классы (которые, очевидно, не полагаются на параметр типа T, которым вы не являетесь. не знаю) вы можете привести к.
Как правило, вы не должны позволять анонимным типам избегать метода, в котором они используются. Если вам нужно передать информацию за пределы метода, в котором находится запрос, то то, что вы делаете, правильно при создании специализированный класс, а затем возвращает последовательность этого.
Обратите внимание, что есть некоторые оправданные применения для передачи анонимных типов за пределы вашего метода (через возвращаемый тип объекта или другие базовые классы для последовательностей этих типов), но для подобных случаев это не один из них.