注: この質問は別の質問と似ていますが、その質問は Genom-e のコンテキストで質問されたものであり、未回答のままです。私の質問は、LINQ DynamicQuery のコンテキストにあります。
によって提供されるString
拡張メソッドのオーバーロードを使用しています。文字列リテラルを渡すとうまくいきます。親と子の間に 1 対 1 の関係がある限り、プライマリ エンティティ フィールド ie:で並べ替えることができ、子エンティティ フィールドで並べ替えることができます ie: 。OrderBy
System.Linq.Dynamic
OrderBy
person.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 以上の がありますChildren
。Mother
それぞれに 0 行または 1 行があることがわかりますPerson
。
Person
明らかに、これらは実際のプロジェクトで使用している正確なテーブル名ではありませんが、とMother
、 と とPerson
の関係がどのようChild
に異なるかがわかります。
Selectorを受け入れるためにオーバーロードを
試みましたが、戻り値の型が Generic 型ではなく Anonymous に変わります。プロセスでを使用する方法はありますが、それでも を返しますか?Find()
Selector
p = Person
child = First().Child
Selector
OrderBy
IEnumerable(of TEntity)