1

注意:我意识到这个问题与另一个问题相似,但是该问题是在 Genom-e 的上下文中提出的,并且仍未得到解答。我的问题是在 LINQ DynamicQuery 的上下文中。

我正在String使用OrderBySystem.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

显然,这些不是我在实际项目中使用的确切表名,但您可以看到PersonandMother和 with Personand之间的关系是如何Child不同的。

选择器
我尝试重载Find()以接受一个Selector选择p = Personchild = First().Child但返回类型更改为匿名,而不是通用类型。有什么方法可以SelectorOrderBy过程中使用但仍然返回 aIEnumerable(of TEntity)吗?

4

1 回答 1

1

你可以这样做(C#,对不起......):

people.Select(p => Person = p, Child = p.Children.First())
      .OrderBy("Child.LastName")
      .Select(p => p.Person);

顺便说一句,没有"it.你正在使用System.Linq.Dynamic,而"it.你正在使用 ESQL。任何一个都可以,但你不应该同时使用!

于 2010-08-18T18:17:04.900 回答