Выражения DbSortClause должны иметь тип, сопоставляемый параметру Order Name: Key
Я использую Linq для объекта, у которого есть следующий запрос
IQueryable<DomainModel.User> userResult =
userResult.OrderBy(u => u.UserClientRoles.OrderBy(r => r.Role.RoleName));
Но я получаю
Выражения DbSortClause должны иметь тип, сопоставимый по порядку
Параметр Имя: Ключ
и возвращает 0 colletction.
Любая идея об этом.
Ответы
Ответ 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().