Подтвердить что ты не робот

Выражения DbSortClause должны иметь тип, сопоставляемый параметру Order Name: Key

Я использую Linq для объекта, у которого есть следующий запрос

IQueryable<DomainModel.User> userResult = 
      userResult.OrderBy(u => u.UserClientRoles.OrderBy(r => r.Role.RoleName));

Но я получаю

Выражения DbSortClause должны иметь тип, сопоставимый по порядку

Параметр Имя: Ключ

и возвращает 0 colletction.

Любая идея об этом.

4b9b3361

Ответ 1

.OrderBy() при работе с базами данных должен принимать делегат, который возвращает только одно свойство, которое представляет столбец в вашей базе данных. Я не уверен, что вы пытаетесь сделать, но выглядит как

u.UserClientRoles.OrderBy(r => r.Role.RoleName)

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

Ответ 2

У меня была та же проблема, я решил это с помощью этого:

ваш код:

IQueryable<DomainModel.User> userResult = userResult.OrderBy(u => u.UserClientRoles.OrderBy(r => r.Role.RoleName));

мой код:

List<Membership> results = new List<Membership>(); results.AddRange(memberships.OrderBy(m => m.Roles)); memberships = results.AsQueryable();

совпадения:

*.OrderBy(m => m.Roles)

решение:

*.OrderBy(m => m.Roles.Select(r => r.RoleId).FirstOrDefault())

Возможная причина проблемы:

Возможно, вы сделали то, что я сделал, и вывести, что 1 пользователь/член может иметь более одной роли в одном членстве. Это вызвало конфликт с/на OrderBy(), потому что приложение может просто "заказать" один элемент в то время, когда она вызывает роль (которая является ICollection элементов) вместо этого получает более одного элемента без какого-либо приоритета (даже если мы могли предположить, что приложение будет принимать индекс роли как приоритетный базовый уровень, на самом деле его нет).

:

Когда вы добавляете *.Select(r => r.RoleId), вы указываете приложению, какой элемент будет использоваться для OrderBy(). Но, как вы увидите, когда вы, возможно, достигнете этого момента, просто с помощью *.Select(r => r.RoleId) может быть недостаточно, потому что приложение по-прежнему получает несколько результатов с одинаковым уровнем приоритета. Добавляя *.Select(r => r.RoleId).FirstOrDefault(), вы в основном говорите: "... мне все равно, сколько результатов вы получили от этого элемента, просто сосредоточиться на первом результате или заказать их по умолчанию..." (по умолчанию обычно означает ПУСТОЙ или NULL).

дополнительная информация:

Я использовал непрофессиональные простые понятия/значения, чтобы объяснить сложное решение с помощью простых слов, а это значит, что у вас могут возникнуть проблемы с поиском похожих сообщений в Интернете, используя слова/понятия, используемые в этом "ответе". В противном случае сам код работает, и вы не должны иметь никаких проблем, применяя его и/или изменяя его самостоятельно. УДАЧИ!!! (^ _ ^)

Ответ 3

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

Вы должны использовать

var query = from Foo in Bar
            orderby Foo.PropertyName
            select Foo;

Вместо

var query = from Foo in Bar
            orderby Foo
            select Foo;

Примечание: вы получите одно и то же событие поведения, если есть переопределение в методе Foo ToString().