В LINQ нет такого понятия, как столбец, только поля и свойства. Возможно, вы имеете в виду указание индекса свойства в анонимном типе, который вы создаете:
from p in persons
orderby 1
select new { p.FirstNam, p.LastName }
Это невозможно, потому что а) вы не можете упорядочить по свойству проекции (выходное значение в анонимном типе), и б) вы не можете упорядочить по индексу. Чтобы обойти а), вы можете использовать ключевое слово "в":
from p in persons
orderby p.FirstName
select new { First = p.FirstName, Last = p.LastName }
into tmp
orderby tmp.First
select tmp;
Если вы используете провайдера LINQ на основе IQueryable (например, LINQ to SQL, в отличие от LINQ для объектов на основе IEnumerable), вы можете проанализировать дерево выражений, найти выражение на основе некоторого индекса и добавить соответствующий Вызов метода OrderBy.
var query = from p in persons
select new { Name = p.FirstName + " " + p.LastName, ...}
query = AddOrderByPosition (query, 1);
foreach (var p in query) {...}
AddOrderByPosition должен будет создать новое дерево выражений, которое использует исходное выражение запроса в качестве источника (подзапрос, который, по сути, тоже создает «в»), и добавить в конце вызов OrderBy (нет необходимости в Select ). Сначала вы хотите прочитать главу о спецификациях C # о преобразовании выражений запросов, и у вас должен быть некоторый опыт работы с отражениями и выражениями, если вы хотите сделать это за разумное время.
Если вы хотите, у меня есть пример кода, который я могу предоставить.