Использование First () с OrderBy и DynamicQuery в связанных таблицах «один ко многим» - PullRequest
1 голос
/ 18 августа 2010

Примечание: я понимаю, что этот вопрос похож на другой вопрос , однако этот вопрос был задан в контексте 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)?

1 Ответ

1 голос
/ 18 августа 2010

Вы можете сделать (C #, извините ...):

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

Кстати, без "it. вы используете System.Linq.Dynamic, а с "it. вы используете ESQL.Либо один в порядке, но вы не должны использовать оба!

...