Примечание: я понимаю, что этот вопрос похож на другой вопрос , однако этот вопрос был задан в контексте Genom-e и остается без ответа. Мой вопрос в контексте LINQ DynamicQuery.
Я использую перегрузку метода расширения String
для OrderBy
, предоставляемого System.Linq.Dynamic
. Передача строкового литерала в OrderBy
прекрасно работает. Я могу сортировать по полям первичной сущности, то есть: person.OrderBy("LastName")
, и я могу сортировать по полям дочерней сущности, если между родителем и потомком есть взаимно-однозначное отношение, т.е.
Однако я не могу выполнить сортировку по дочернему полю, если есть связь один-ко-многим с родителем и дочерним элементом, например: person.OrderBy("Children.LastName")
. Это выдает ошибку: No property or field 'Children' exists in type 'Person'
.
Очевидно, что это не так, потому что интерпретатор не знает , который child's LastName
Я пытаюсь использовать в операции сортировки. Я могу легко решить эту проблему, создав выражение, подобное этому (Function(p As Person) p.Children.First.LastName)
.
Но как я могу получить подобное First
поведение при использовании строкового литерала расширения OrderBy
? В конечном итоге я хочу иметь возможность сделать что-то вроде этого: person.OrderBy("it.Lastname desc, Children.First().FirstName asc")
Редактировать: Я использую шаблон Repository, и вот как выглядит моя Find
функция:
Public Function Find(ByVal predicate As Expression(Of Func(Of TEntity, Boolean)), ByVal orderBy As String, ByVal skip As Integer, ByVal take As Integer) As IEnumerable(Of TEntity) Implements ILinqSqlRepository(Of TEntity, TContext).Find
If String.IsNullOrEmpty(orderBy) Then
Return Find(predicate, skip, take)
Else
Dim qry = Context.GetTable(Of TEntity)().Where(predicate).OrderBy(orderBy).Skip(skip).Take(take)
Return qry.ToList()
End If
End Function
Редактировать: Это соотношение между Person
и Child
таблицами:
Person Table
PersonId (pk)
MotherId (fk to Mother Table)
LastName
FirstName
Child Table
ChildId (pk)
PersonId (fk to Person Table)
LastName
FirstName
Mother Table
MotherId (pk)
LastName
FirstName
Каждый Person
может иметь 0 или более Children
. Вы можете видеть, что может быть 0 или 1 Mother
строк для каждого Person
.
Очевидно, что это не точные имена таблиц, которые я использую в своем реальном проекте, но вы можете видеть, как различаются отношения между Person
и Mother
и с Person
и Child
.
Селектор
Я попытался перегрузить Find()
, чтобы принять Selector
, который выбирает p = Person
и child = First().Child
, но тип возвращаемого значения меняется на Anonymous, а не на Generic. Есть ли способ использовать Selector
в процессе OrderBy
, но все равно вернуть IEnumerable(of TEntity)
?