Если я правильно понимаю, у вас есть объект (скажем, родитель), который содержит объект (скажем, ребенок). У ребенка есть поле FullName, и вы хотите отсортировать список родителей по ребенку FullName.
Если это так, то OrderBy () должно сделать это за вас.
Скажем, у нас есть список родителей
Parent {Id = 1, Child = {Id = 1, FullName = "Jan"}}
Parent {Id = 2, Child = {Id = 2, FullName = "Feb"}}
Parent {Id = 3, Child = {Id = 3, FullName = "Mar"}}
Parent {Id = 4, Child = {Id = 4, FullName = "Apr"}}
сортировка их с помощью OrderBy ()
Dim sorted = Items.OrderBy(Function(itm) itm.Child.FullName)
дает
Parent {Id = 4, Child = {Id = 4, FullName = "Apr"}}
Parent {Id = 2, Child = {Id = 2, FullName = "Feb"}}
Parent {Id = 1, Child = {Id = 1, FullName = "Jan"}}
Parent {Id = 3, Child = {Id = 3, FullName = "Mar"}}
(пример ниже)
чч,
Алан.
Редактировать
Просто перечитайте вопрос. У вас есть различные свойства FullName , которые выбираются по имени (из строки запроса?)
Вы можете выбрать свойство по имени, используя выражение (см. Как мне создать динамический Select для IEnumerable во время выполнения? ) для общей фигуры.
Если выбранное свойство является IComparable (или оно IEquatable? Не слишком уверен, какое именно), то OrderBy () все равно будет работать. Это означает, что пока поля сортировки являются базовыми типами, у вас все в порядке. Если они являются пользовательскими типами (объектами), вам необходимо проделать дополнительную работу ...
Извините за первый неправильный ответ.
Больше правок
У нас пятница и медленно:?
ОК, расширен ответ для доступа к различным дочерним элементам по имени. (Я использовал поля, а не свойства, но любой из них будет работать). Нам все еще нужно знать тип поля, но немного больше работы может удалить это (при необходимости).
Private Class Child
Public Id As Integer
Public FullName As String
End Class
Private Class Parent
Public Id As Integer
Public Child As Child
End Class
Private Items As New List(Of Parent)() From { _
New Parent() With { _
Key .Id = 1, _
Key .Child = New Child() With { _
Key .Id = 1, _
Key .FullName = "Jan" _
} _
}, _
New Parent() With { _
Key .Id = 2, _
Key .Child = New Child() With { _
Key .Id = 2, _
Key .FullName = "Feb" _
} _
}, _
New Parent() With { _
Key .Id = 3, _
Key .Child = New Child() With { _
Key .Id = 3, _
Key .FullName = "Mar" _
} _
}, _
New Parent() With { _
Key .Id = 4, _
Key .Child = New Child() With { _
Key .Id = 4, _
Key .FullName = "Apr" _
} _
} _
}
<TestMethod> _
Public Sub SortByChildName()
Dim expectedParentIds = New () {4, 2, 1, 3}
Dim sortedIds = Items.OrderBy(SelectExpression(Of Parent, String)("Child.FullName")).[Select](Function(itm) itm.Id)
Assert.IsTrue(expectedParentIds.SequenceEqual(sortedIds))
End Sub
<TestMethod> _
Public Sub SortByChildId()
Dim expectedParentIds = New () {4, 3, 2, 1}
Dim sortedIds = Items.OrderBy(SelectExpression(Of Parent, Integer)("Child.Id")).[Select](Function(itm) itm.Id)
Assert.IsTrue(expectedParentIds.SequenceEqual(sortedIds))
End Sub
Public Shared Function SelectExpression(Of TItem, TField)(fieldNames As String) As Func(Of TItem, TField)
Dim type = GetType(TItem)
Dim fields = fieldNames.Split("."C)
Dim arg As ParameterExpression = Expression.Parameter(type, "item")
Dim expr As Expression = arg
For Each field As String In fields
Dim fieldInfo = type.GetField(field)
expr = Expression.Field(expr, fieldInfo)
type = fieldInfo.FieldType
Next
Return Expression.Lambda(Of Func(Of TItem, TField))(expr, arg).Compile()
End Function