EFを使って企業レベルの応用を構築する(四)

9619 ワード

このシリーズのディレクトリ:
EFを使って企業レベルの応用を構築する(一):主にデータベースアクセスベースIreepositoryとRepositoryの実現
EFを使って企業レベルの応用を構築する(二):主に動的な順序付けの拡張の実現
EFを使って企業レベルのアプリケーションを構築する(三):主に柔軟なクエリー条件式Expression<Fun<TEntity、book>を構築する.
EFを使って企業レベルの応用を構築する(四):主にMVC環境の中で先端開発にどのように使うかということと、実例のソースパッケージです.
前の3つの記事では、EFを使用して、どのようにデータの持続性を実現するのに便利かを大まかに説明しました.私たちの簡単な思い出の中には、重要なコンテンツがあります.
  • Repository基質の実現、
  • クエリー条件Expression<Fun<T,book>の構築
  • ソート拡張
  • 先がMVCモードを使う時、どのように私達の前で実現したことをつなぎやすいですか?今日はこの問題について検討します.
    まず、私たちは実際のプロジェクトでどのように使うかを見てみます.もしこの書き方に興味があれば、下を見ます.
     
            ///       ///お問い合わせ商品一覧       ///       ///        public Act Resoult Get Product List()        {            string json=string.Empty;            if(WebRuntimes.LoginUser==null)                return Contront(GetAlertMessage Json);            try            {               //ウィジェットクエリ条件                var queryParam=GetQueryParam();
                    int total=0
                   //クエリデータ                var lst=SysServices.Get ProductList(queryParam,out total);                               //lstをjqgridで受け入れるjson形式に変換します.                Json=Json ForJqgrid(lst,total,queryParam.PageSize,queryParam.PageIndex)            }            catch(Exception ex)            {                ロガー.Log(ElogType.Err,ex);                json=GetAlertMessage Json(「クエリ失敗!」)            }
                return Content(json);        }
    あなたはすぐに上記のコードの中に2つのよく知らない方法があることを発見したかもしれません.検索条件を構築し、データベースからデータを取得します.私達はそれぞれこの2つの方法の中で何をしていますか?
  • まず、コントローラのベースクラスでクエリー条件を構築するこの方法の定義を見てみます.
     
             /// <summary>
            ///           
            /// </summary>
            /// <typeparam name="TEntity">      </typeparam>
            /// <typeparam name="TPgQueryExp">        </typeparam>
            /// <returns></returns>
            protected EFQueryParam<TEntity> GetQueryParam<TEntity, TPgQueryExp>()
                where TEntity : class
                where TPgQueryExp : class, IEFQueryExpression<TEntity>, new()
            {
                string sidx = "Code";
                if (!string.IsNullOrEmpty(Request.QueryString["sidx"]))
                {
                    sidx = Request.QueryString["sidx"].ToString();
                }
                bool isSordAsc = false;
                if (!string.IsNullOrEmpty(Request.QueryString["sord"]))
                {
                    if (Request.QueryString["sord"].ToString() == "asc")
                    {
                        isSordAsc = true;
                    }
                }
                int pageSize = System.Convert.ToInt32(Request.QueryString["rows"]);
                int pageIndex = System.Convert.ToInt32(Request.QueryString["page"]) - 1;
    
                IEFQueryExpression<TEntity> exp = null;
                if (!string.IsNullOrEmpty(Request["d"]))
                {
                    try
                    {
                        exp = GetObjectOfJson<TPgQueryExp>(Microsoft.JScript.GlobalObject.unescape(Request["d"]));
                    }
                    catch
                    { }
                }
                if (exp == null)
                    exp = new TPgQueryExp();
    
                EFQueryParam<TEntity> ret = new EFQueryParam<TEntity>(exp, sidx, isSordAsc, pageIndex, pageSize);
                return ret;
            }
            ,          PgQueryProductExp,         ?        ,             ,             
     
    ////   ///商品の条件を調べるためのページ   ///    public class PgQuery ProductExp:IEFQuery Exprestion<Prodct>    {        public string Code{get;set}        public string Name{get;set}        public string Specification{get;set}        public Gid CategoryId{get;set}        public int EnbaleFlagG{get;set;
            public PgQuery ProductExp()        {            EnbaleFlaag=1        }
            public Expression<Fun<Product,book>GetExpression()        {
                var exp=EFExpression<Product>.CreateSignleLogic(ELLogicType.And)                .Like(o=>o.Code)                .Like(o=>o.Name)                .Like(o=>o.Specification、Specification);            if(CategoryId!=Gid.Empty)                exp=exp.Equal(o=>o.categoryId)
               //条件の中で有効かどうかを判断する必要がありますか?            if(EnbaleFlags>-1)            {                exp=exp.Equal(o=>o.Is Enballed、(EnbaleFlags==1)            }
                return exp.GetExpression()        }
             SysService       ,          
     
    ////      ///製品データの検索      ///      ///       public IList<Product>Get Product List(EFQueryParam<Prodt>queryParam、out int total)       {           total=0;           IListlst=null;           using(var repository=new Repositoryo.ProducCategory).Get(queryParam,out total).ToList()           }           if(lst!=null)               lst=lst.Select(o=>o.GetJson Entity().ToList()           return lst;       }
     
    OKです.これは完全な使用プロセスです.簡単なようです.でも、注意深いあなたはすでに発見したかもしれません.私達は検索を使う時、条件の数は前の記事のExpression<Fun<T、book>モードではないようです.このEFQueryParam<T>タイプを使っています.そうです.私達が使う時、多くの兄弟がこの照会方法を話しています.数が多すぎます.包装してください.OKです.包装しましょう.
     
     
    /// <summary>
        ///       
        /// </summary>
        /// <typeparam name="TExpression">    </typeparam>
        public abstract class QueryParam<TExpression>
        {
            /// <summary>
            ///     
            /// </summary>
            public TExpression Expression { get; set; }
    
            /// <summary>
            ///     
            /// </summary>
            public string OrderPropertyName { get; set; }
    
            /// <summary>
            ///        , false   OrderPropertyName      
            /// </summary>
            public bool IsAscSort { get; set; }
    
            /// <summary>
            ///     ,     
            /// </summary>
            public int PageIndex { get; set; }
    
            /// <summary>
            ///     ,       
            /// </summary>
            public int PageSize { get; set; }
    
            /// <summary>
            ///          
            /// </summary>
            public bool IsPagingQuery { get { return PageSize > 0; } }
    
        }
        /// <summary>
        /// EF     QueryParam
        /// </summary>
        /// <typeparam name="TEntity">        </typeparam>
        public class EFQueryParam<TEntity> : QueryParam<Expression<Func<TEntity, bool>>> where TEntity : class
        {
            /// <summary>
            ///       EFQueryParam   
            /// </summary>
            /// <param name="exp">    </param>
            /// <param name="orderPropertyName">       </param>
            /// <param name="isAscSort">       ,false     </param>
            /// <param name="pageIndex">    ,     </param>
            /// <param name="pageSize">    ,       </param>
            public EFQueryParam(Expression<Func<TEntity, bool>> exp, string orderPropertyName,
                bool isAscSort, int pageIndex, int pageSize)
            {
                this.Expression = exp;
                this.OrderPropertyName = orderPropertyName;
                this.IsAscSort = isAscSort;
                this.PageIndex = pageIndex;
                this.PageSize = pageSize;
            }
    
            /// <summary>
            ///       EFQueryParam   
            /// </summary>
            /// <param name="exp">    </param>
            /// <param name="orderPropertyName">       </param>
            /// <param name="isAscSort">       ,false     </param>
            /// <param name="pageIndex">    ,     </param>
            /// <param name="pageSize">    ,       </param>
            public EFQueryParam(IEFQueryExpression<TEntity> exp, string orderPropertyName,
                bool isAscSort, int pageIndex, int pageSize) :
                this(exp.GetExpression(), orderPropertyName, isAscSort, pageIndex, pageSize)
            {
            }
     
    本シリーズも完成しました.ここでダウンロードしますの完全なソースコードを自分で試してみてください.