注意:我意识到这个问题与另一个问题相似,但是该问题是在 Genom-e 的上下文中提出的,并且仍未得到解答。我的问题是在 LINQ DynamicQuery 的上下文中。
我正在String
使用OrderBy
由System.Linq.Dynamic
. 将字符串文字传递给OrderBy
效果很好。我可以对主要实体字段进行排序,即:person.OrderBy("LastName")
只要父子实体之间存在一对一的关系,我就可以对子实体字段进行排序,即:person.OrderBy("Mother.LastName")
。
但是,如果与父母和孩子存在一对多关系,我无法对孩子的字段进行排序,即:person.OrderBy("Children.LastName")
。这会引发错误:No property or field 'Children' exists in type 'Person'
.
显然这失败了,因为解释器不知道我在排序操作中尝试使用哪个孩子。LastName
我可以通过创建这样的表达式轻松解决这个问题(Function(p As Person) p.Children.First.LastName)
。
但是,当使用 的字符串文字扩展时,我怎样才能获得类似First
的行为OrderBy
?最终我希望能够做这样的事情:person.OrderBy("it.Lastname desc, Children.First().FirstName asc")
编辑: 我正在使用存储库模式,这就是我的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
. 您可以看到Mother
每个 0 或 1 行Person
。
显然,这些不是我在实际项目中使用的确切表名,但您可以看到Person
andMother
和 with Person
and之间的关系是如何Child
不同的。
选择器
我尝试重载Find()
以接受一个Selector
选择p = Person
,child = First().Child
但返回类型更改为匿名,而不是通用类型。有什么方法可以Selector
在OrderBy
过程中使用但仍然返回 aIEnumerable(of TEntity)
吗?