Что вы можете сделать, с анонимным типом ... это использовать их в select, а после использовать в foreach.
var q = _someCollection.Where(c => c.Id == 100).Select (new { Id = c.Id, Name = c.Name});
foreach(var p in q) {
var id = p.Id;
}
Это сработает, потому что на самом деле компилятор знает тип нового {Age = c.Age, Position = c.Pos} (для этого генерируется дополнительная информация).
Как только вы преобразуетесь в List, тогда вы конвертируете в объект (помещаете в Session), вы больше не можете получать информацию о типе.
Я бы ввел некоторый реальный тип CountryInfo
и изменил запрос;
var q = _someCollection.Where(c => c.Id == 100).Select(new ContryInfo { Id = c.Id, Name = c.Name}).
Session["a"] = q.ToList();
var list = (IList<ContryInfo>)Session["a"];