はじめに:確かに、動的クエリのニーズを満たすEFの使用は、式の動的組み合わせと呼ばれる公共問い合わせの確立が不可欠であり、以下が後でリコールのために記録される複数のソートフィールドの動的な組み合わせを構築することです
1、ソートフィールドの複数の組み合わせのための構造を確立するために、構造は2つのフィールドがあり、属性名をソートする、決意は降順昇順かどうかであります
パブリック 構造体OrderModelField { 公共の 文字列 propertyNameの{ 取得します。セット; } パブリック ブール IsDESC { 得ます。セット; } }
コンビネーション方法
公共のIList <T> GetAllEntity(式<のFunc <T、BOOL >>条件、INT pageIndexパラメータ、INT pageSizeを、外 長い合計、paramsはOrderModelField [] orderByExpression) { // フィルタ条件 VARクエリ= この .QQYALIEntities.Set <T> ().Where(条件条件のため); // 式可変パラメータ作成 VARパラメータExpression.Parameter =(typeof演算(T)を、" O " )。 もし(orderByExpression!= nullの && orderByExpression.Length> 0 ) { 以下のために(int型私は= 0 ; I <orderByExpression.Lengthを; I ++ ) { // 属性に応じた属性の名前を取得 するvarプロパティ= typeof演算(T).GetProperty(OrderByExpression [I] .propertyName) // アクセス属性表現の作成 VAR propertyAccess = Expression.MakeMemberAccess(パラメータ、プロパティ); VAR orderByExp = 式、λ(propertyAccess、パラメータ) 文字列 ORDERNAME = orderByExpression [i]は.IsDESC?" OrderByDescending ":" のOrderBy " 。 MethodCallExpression resultExp = Expression.Call(typeof演算(照会)、ORDERNAME、新しいタイプ[] { typeof演算(T)、property.PropertyType}、query.Expression、Expression.Quote(orderByExp))。 クエリ = query.Provider.CreateQuery <T> (resultExp)。 } } 合計 = query.Count()。 リターン query.Skip((pageIndexパラメータ- 1)* のpageSize).Take(pageSizeを).ToList(); }
秩序にのみソートフィールドSQL Serverプロファイラビューディスプレイを使用してコード生成されるSQL文の上で発見され、ほとんどのソートフィールドで、それを変更し、カバーされるべきです。
/// <要約> /// 根据条件获取多个实体 /// </要約> /// ます。<param name = "条件"> </ param>の /// <リターン> </リターン> 公共のIList < T> GetAllEntity(式<のFunc <T、BOOL >>条件、INT pageIndexパラメータ、INT pageSizeを、外 長い合計、paramsはOrderModelField [] orderByExpression) { // フィルタ条件 VARクエリ= この .QQYALIEntities.Set <T> ().Where(条件条件のため); // 式可変パラメータ作成 VARパラメータExpression.Parameter =(typeof演算(T)を、" O " )。 もし(orderByExpression!= nullの && orderByExpression.Length> 0 ) { 以下のために(int型私は= 0 ; I <orderByExpression.Lengthを; I ++ ) { // 属性に応じた属性の名前を取得 するvarプロパティ= typeof演算(T).GetProperty(OrderByExpression [I] .propertyName) // アクセス属性表現の作成 VAR propertyAccess = Expression.MakeMemberAccess(パラメータ、プロパティ); VAR orderByExp = 式、λ(propertyAccess、パラメータ) 文字列 ORDERNAME = "" ; もし(I> 0 ) { ORDERNAME = orderByExpression [i]は.IsDESC?" ThenByDescending ":" ThenBy " 。 } 他 ORDERNAME = orderByExpression [i]は.IsDESC?" OrderByDescending ":" のOrderBy " 。 MethodCallExpression resultExp = Expression.Call(typeof演算(照会)、ORDERNAME、新しいタイプ[] { typeof演算(T)、property.PropertyType}、query.Expression、Expression.Quote(orderByExp))。 クエリ = query.Provider.CreateQuery <T> (resultExp)。 } } 合計 = query.Count()。 リターン query.Skip((pageIndexパラメータ- 1)* のpageSize).Take(pageSizeを).ToList(); }
[並べ替えは、最初のソート条件は、ような現象が発生してカバーしない場合ThenByをソートするために使用されるいくつかの他の種類を使用して決定しました
ThenByと()もともと注文した値を覚えて、その後、他の行フィールド