Упорядочить по строке по номерам с помощью QueryExpression

У меня проблема с заказом номеров, которые сохраняются в виде строки в CRM,

Он работает нормально до 10, затем он говорит, что 9> 10. Я знаю простое решение, в котором я могу добавлять нули к строкам фиксированной длины. Интересно, есть ли способ каким-то образом упорядочить строку по int.

Мой код:

       QueryExpression query = new QueryExpression(entity);
       query.ColumnSet.AddColumn(ID);
       query.AddOrder(ID, OrderType.Descending); //there is a problem because the type is string.
       EntityCollection entityCollection = organizationService.RetrieveMultiple(query);

person Moran Barzilay    schedule 21.03.2018    source источник


Ответы (2)


Я не думаю, что есть какой-то простой способ добиться этого. Я столкнулся с той же проблемой для почтового индекса и в итоге сохранил оба значения, то есть строку и целое число. И во время запроса я использовал поле int для его сортировки.

Надеюсь, это поможет, Рави Кашьяп

person Ravi Kashyap    schedule 22.03.2018
comment
Спасибо, думаю, это еще один способ решить эту проблему. - person Moran Barzilay; 22.03.2018

Другим возможным решением этой проблемы может быть сортировка результатов запроса с использованием метода LINQ OrderBy() вместо встроенного упорядочения QueryExpression.

EntityCollection results = _client.RetrieveMultiple(query);

var sortedResults = results.Entities.OrderBy((e) => 
                    int.Parse(e.GetAttributeValue<string>("nameofattribute"))
                    );

Это даст результаты, которые вы ищете. Это не идеальное решение, но, по крайней мере, вам не нужно хранить все дважды.

person Peter Van Drunen    schedule 23.03.2018
comment
Мы тестировали в нашей работе LINQ vs QueryExpression. Оказалось, что время выполнения QueryExpression немного быстрее, чем LINQ. Вот почему я хотел сделать это с помощью QueryExpression. Также этот ответ кажется мне плохим, потому что сначала вы извлекаете всю информацию, а затем снова запрашиваете ее. - person Moran Barzilay; 25.03.2018
comment
Да, это решение работает медленнее, чем, возможно, лучшее решение. Теоретически выражение LINQ здесь должно выполняться относительно быстро, потому что все делается в памяти, а не по сети, но у вас все еще есть основные накладные расходы на сортировку списка (которые могут быть довольно высокими в зависимости от того, с каким объемом данных вы работаете). ). Лично я считаю, что решение @RaviKashyap лучше, чем мое, но недостатком является то, что вы в конечном итоге сохраняете все дважды для этого поля, и вам нужна система для синхронизации этих значений. - person Peter Van Drunen; 29.03.2018