Почему структура сущности, не обращая внимания на мои заявки?

StackOverflow https://stackoverflow.com//questions/12695855

  •  12-12-2019
  •  | 
  •  

Вопрос

Я переписываю приложение, которое необходимо дублировать логику алфавита старой системы мэйнфрейма. В старой системе MainFrame идентификаторы записи изменений элемента представлены в алфавитном порядке от A через Z, а затем начинается с AA, AB и так далее. К сожалению, оба SQL Server, так и .NET хотят положить AA между A и B, поэтому я должен прыгать через несколько обручей. Я пытаюсь сначала сортировать идентификаторы изменений, по убыванию длиной, а затем по алфавиту в порядке убывания.

Вот метод, который я использую для получения данных:

protected internal IList<TeamViewModel> GetTeams(string recordId, string changeId)
{
    var viewModels = (from x in repository.Teams
               where x.RecordId == recordId && x.ChangeId.Length <= changeId.Length && 
                 (x.ChangeId.CompareTo(changeId) == -1 || x.ChangeId.CompareTo(changeId) == 0)
               orderby x.ChangeId.Length descending, x.ChangeId descending, x.ChangeId descending
               group x by x.TeamId into grp
               select grp.FirstOrDefault())
               .ToList()
               .Select(TeamViewModel.FromEntity)
               .ToList();

            return viewModels;
}
.

Каждая «запись» имеет набор записей изменений, и каждое изменение записывает свойство Medive и и Teamid, которая сделала изменение. Я пытаюсь получить «новейший» (в соответствии со старой логикой сортировки Mainframe) измените запись для каждого отчетливого Teamid. Другими словами, я пытаюсь заказать записи, группировать их командой, а затем схватить первую запись из каждой группы.

Свойство Repository.Teams Возвращает IQueryable, который обернет объект, объявленный в моем ObjectContext.

Что на самом деле дует, состоит в том, что этот запрос работает нормально, когда я запускаю его в LinqPad (с конфигурацией по умолчанию) и этот самый метод выполняется нормально из-под единичных тестов, когда я ввел макет моего Репозиторий в этот класс, который у меня установить для извлечения точных одинаковых данных, которые находится в базе данных SQL.

Но когда этот метод выполняется во время выполнения, он ведет себя так, как будто линия с заказами полностью опущена, и фактически дает мне одинаковые результаты, которые я GE TIN LinqPad (с настройкой по умолчанию), когда я прокомментую строку с помощью заказ. SQL Profiler показывает, что сгенерированный SQL не сможет расшифровать человека, но не содержит слова «порядок» в нем где угодно.

в качестве окончательной заметки, когда я настроил LinqPAD, чтобы использовать мой набранный набор данных, созданный EF в сборке моего проекта, я получаю те же результаты, которые я вижу во время выполнения, с результатами появляются, как будто заказа, не учитываются.

Я хотел бы показать фактические результаты, но данные являются собственностью, поэтому сначала подумайте, что правильные результаты, предоставляемые LinqPad и моим модульным тестам, содержат записи с идентификаторами, такими как «Y» и «Z», где в качестве необъяснимого (для меня) Результаты, которые я вижу в моем проекте во время выполнения, похожи на «A» и «B».

Может кто-нибудь увидеть, что здесь происходит, и так же важно, то, что мне нужно изменить, чтобы сделать эту функцию, как я ожидаю?

Мой проект использует основу для объекта 5.0, и я использую linqpad 4.42.01.

Большое спасибо!

Это было полезно?

Решение

Group by не гарантирует сохранить оригинальный порядок.Если вы хотите заказать, вы должны заказать после группы.

Фактически, даже не имеет смысла заказывать до того, как группа, поскольку группа гарантирована, чтобы изменить заказ (если нет только одной группы).

Другие советы

Я сделаю дикое предположение ...

Ваши метки все одинаковые длины.База данных имеет их сопоставленные в виде столбца CHAR (10) или что-то вместо Varchar, поэтому A действительно «A» и AB действительно «ab».Mainframes и Cobol и Flat файлы со смещениями приходят в голову как мое обоснование.Если это то, что вы должны сначала придется обрезать (), прежде чем получить длину.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top