在一对多相关表中使用First()和OrderBy以及DynamicQuery

时间:2010-08-18 17:58:57

标签: linq linq-to-sql sql-order-by one-to-many dynamicquery

  

注意:我意识到这个问题类似于another question,但是这个问题是在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

修改:这是PersonChild表之间的关系:

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行。

显然这些不是我在实际项目中使用的确切表格名称,但您可以看到PersonMother以及Person和{{1}之间的关系是不同的。

选择
我已尝试重载Child以接受选择Find()Selector的{​​{1}},但返回类型更改为匿名,而不是通用类型。有没有办法在p = Person流程中使用child = First().Child,但仍会返回Selector

1 个答案:

答案 0 :(得分:1)

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

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

BTW,没有"it.您正在使用System.Linq.Dynamic,而"it.您正在使用ESQL。任何一个都可以,但你不应该同时使用它们!