Почему IEnumerable.ToList() возвращает поля в алфавитном порядке?

У меня есть эта простая функция в классе, который возвращает IENumerable Colection с использованием проекции LINQ:

public IEnumerable<Pedidos> Pedidos_Listar(string sComprobante, Clientes MyCliente = null, DateTime? dDesde = null, DateTime? dHasta = null, bool bCumplidos = false)
        {
            using (var context = new OhmioEntities())
            {                
                return
                    (from Pedidos in context.Pedidos
                    join Clientes in context.Clientes on Pedidos.ID_Cliente equals Clientes.ID_Cliente
                    where Pedidos.ID_Comprobante == sComprobante                    
                    select Pedidos).ToList();                
            }
        }

Может ли кто-нибудь сказать мне, почему поля IEnumerable возвращаются в алфавитном порядке, а не в исходном определении объекта? И как вернуть участников в определенном порядке? Спасибо

ОБНОВЛЕНИЕ Извините, если мой вопрос не ясен. я постараюсь объяснить свою проблему. Класс Pedidos (это действительно класс POCOs, сгенерированный из EF) имеет некоторые свойства, подобные этому:

public class Pedidos
    {
        public virtual int ID_Pedido { get; set; }        
        public virtual int Numero { get; set; }
        public virtual DateTime Fecha { get; set; }
        public virtual DateTime FechaEntrega { get; set; }            
        public virtual string Cliente { get; set; }
        public virtual Decimal Bruto { get; set; }
        public virtual Decimal Neto { get; set; }
        public virtual Boolean Aprobado { get; set; }
        public virtual string Observaciones { get; set; }
        public virtual Boolean Entregado { get; set; }        
    }

Моя проблема с заказом не связана с данными внутри класса, поэтому предложение ORDER не решает мою проблему. Речь идет о порядке свойств. Когда я использую ToList() для заполнения этого класса, я получаю свойства в алфавитном порядке (Aprobado, Bruto и т. д.) вместо определения порядка класса (ID_Pedido, Numero и т. д.). Язык названий полей здесь не имеет значения. Надеюсь, это ясно мой ответ.

Это результат, показанный VS

Когда я пытаюсь показать данные о клиенте через сетку данных:

та же проблема здесь

Как вы можете видеть, в обоих случаях свойства отображаются в алфавитном порядке, а не в порядке класса. Почему?


person ericpap    schedule 29.03.2014    source источник
comment
1. Удача(?) 2. порядок использования   -  person Raphaël Althaus    schedule 29.03.2014
comment
Алфавитный порядок чего? Мы вообще не знаем, что такое Pedidos... И что вы подразумеваете под полями IEnumerable? Ваш вопрос пока не ясен.   -  person Jon Skeet    schedule 29.03.2014
comment
@ericpap Перевод кода на английский имел бы смысл, чтобы получить более качественные ответы...   -  person Matías Fidemraizer    schedule 29.03.2014
comment
Что вы имеете в виду, что свойства в порядке? Как вы отображаете порядок свойств?   -  person Scott Chamberlain    schedule 30.03.2014
comment
Именно так Visual Studio показывает ваши данные. Во время сеанса отладки члены всегда отображаются в алфавитном порядке.   -  person MarcinJuraszek    schedule 30.03.2014
comment
Да, но, как вы можете видеть на изображении, я просто добавляю, проблема также возникает, когда я помещаю данные в сетку данных, используя шаблон MVVM...   -  person ericpap    schedule 30.03.2014


Ответы (3)


Как и в случае с SQL, для запроса LINQ нет определенного порядка. Он может возвращаться в любом порядке. Тот факт, что он возвращает упорядоченный список, вероятно, благодаря внутренней работе, и на него нельзя полагаться. Если вы хотите построить определенный порядок, используйте метод orderby или OrderBy:

               (from Pedidos in context.Pedidos
                join Clientes in context.Clientes on Pedidos.ID_Cliente equals Clientes.ID_Cliente
                where Pedidos.ID_Comprobante == sComprobante
                orderby Pedios.[the property you want to order by]
                select Pedidos).ToList();  
person Euphoric    schedule 29.03.2014

Порядок в IEnumerable не определен, и это может быть что угодно. Если вы все еще хотите определить порядок, вы можете использовать OrderBy.

person elyashiv    schedule 29.03.2014

В вашем запросе нет ничего, что преднамеренно упорядочивало бы его в алфавитном порядке.

Используйте ключевое слово orderby, чтобы упорядочить результаты:

from Pedidos in context.Pedidos
join Clientes in context.Clientes
    on Pedidos.ID_Cliente equals Clientes.ID_Cliente
where Pedidos.ID_Comprobante == sComprobante
orderby Pedidos.ID  // change to the field you want to sort by alphabetically
select Pedidos
person Grant Winney    schedule 29.03.2014