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つの方法の中で何をしていますか?まず、コントローラのベースクラスでクエリー条件を構築するこの方法の定義を見てみます.
//// ///商品の条件を調べるためのページ /// 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() }
//// ///製品データの検索 /// /// 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です.包装しましょう.
本シリーズも完成しました.ここでダウンロードしますの完全なソースコードを自分で試してみてください.
EFを使って企業レベルの応用を構築する(一):主にデータベースアクセスベースIreepositoryとRepositoryの実現
EFを使って企業レベルの応用を構築する(二):主に動的な順序付けの拡張の実現
EFを使って企業レベルのアプリケーションを構築する(三):主に柔軟なクエリー条件式Expression<Fun<TEntity、book>を構築する.
EFを使って企業レベルの応用を構築する(四):主にMVC環境の中で先端開発にどのように使うかということと、実例のソースパッケージです.
前の3つの記事では、EFを使用して、どのようにデータの持続性を実現するのに便利かを大まかに説明しました.私たちの簡単な思い出の中には、重要なコンテンツがあります.
まず、私たちは実際のプロジェクトでどのように使うかを見てみます.もしこの書き方に興味があれば、下を見ます.
///
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 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 ,
////
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)
{
}
本シリーズも完成しました.ここでダウンロードしますの完全なソースコードを自分で試してみてください.