EntityFrameworkの動的な組み合わせ、複数のソートフィールド

 

はじめに:確かに、動的クエリのニーズを満たす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と()もともと注文した値を覚えて、その後、他の行フィールド

 

 

オリジナル前方から:https://www.cnblogs.com/yannis/p/3584818.html

おすすめ

転載: www.cnblogs.com/doudouzi/p/11897723.html