1

注: この質問は別の質問と似ていますが、その質問は Genom-e のコンテキストで質問されたものであり、未回答のままです。私の質問は、LINQ DynamicQuery のコンテキストにあります。

によって提供されるString拡張メソッドのオーバーロードを使用しています。文字列リテラルを渡すとうまくいきます。親と子の間に 1 対 1 の関係がある限り、プライマリ エンティティ フィールド ie:で並べ替えることができ、子エンティティ フィールドで並べ替えることができます ie: 。OrderBySystem.Linq.DynamicOrderByperson.OrderBy("LastName")person.OrderBy("Mother.LastName")

ただし、親と子に 1 対多の関係がある場合、子のフィールドを並べ替えることができません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 以上の がありますChildrenMotherそれぞれに 0 行または 1 行があることがわかりますPerson

Person明らかに、これらは実際のプロジェクトで使用している正確なテーブル名ではありませんが、とMother、 と とPersonの関係がどのようChildに異なるかがわかります。

Selectorを受け入れるためにオーバーロードを
試みましたが、戻り値の型が Generic 型ではなく Anonymous に変わります。プロセスでを使用する方法はありますが、それでも を返しますか?Find()Selectorp = Personchild = First().ChildSelectorOrderByIEnumerable(of TEntity)

4

1 に答える 1

1

あなたがすることができます(C#、ごめんなさい...):

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

ところで、を使用せず"it.に、 ESQL を使用System.Linq.Dynamicしています。"it.どちらでも構いませんが、両方を使用しないでください。

于 2010-08-18T18:17:04.900 に答える