<blockquote id="nujtr"></blockquote><sub id="nujtr"><del id="nujtr"></del></sub>
          1. <blockquote id="nujtr"><del id="nujtr"><legend id="nujtr"></legend></del></blockquote>

                基于Entity Framework自定義分頁效果

                基于Entity Framework自定義分頁效果

                簡介

                之前寫個一個基于Dapper的分頁實現,現在再來寫一個基于Entity Framework的分頁實現,以及增刪改的通用實現。


                如何運行示例

                還是像先前一樣:

                1. 先Clone下代碼,在Database里面解壓縮Database.7z

                2. Attach到Sql Server LocalDB上。如果你用的不是Sql Server的LocalDB,你需要更改App.Config里的連接字符串。

                3. Ctrl + F5,運行示例程序。

                Repository 基類 - 查詢

                Common\AbstractRepository.cs 是Repository的基類,實現了增刪改查的一些方法,例如:

                public virtual Tuple<IEnumerable<T>, int> Find(Expression<Func<T, bool>> criteria
                      , int pageIndex
                      , int pageSize
                      , string[] asc
                      , string[] desc
                      , params Expression<Func<T, object>>[] includeProperties)

                這個方法是AbstractRepository查詢方法中的一個,用于自定義分頁查詢,其中criteria 為一個表達式,作為查詢的條件,參數pageIndex, pageSize, asc, desc為分頁相關參數;

                關于多表(關聯表):

                includeProperties為在多表時候,Join相關聯的表。因為EF默認是Lazy Loading,相關聯的表默認不是立即加載的,所以有時候如果寫代碼不小心,在for循環里就有可能會循環查詢n個字表。用來includeProperties參數,就可以在查詢時候join關聯表。

                Repository 基類 - 增刪改

                AbstractRepository已經用泛型實現了增刪改方法:

                public virtual T Create(T entity)
                public virtual T Update(T entity)
                public virtual T CreateOrUpdate(T entity)
                public virtual void Delete(TId id)

                另外,關于transaction的實現,我使用了Unit of Work模式,多個Repository共享一個DBContext,關于UOW,請在Common\UnitOfWork.cs里找到。

                調用UOW的時候,基本類似于這樣:

                var uow = new EFUnitOfWork();
                var repo = uow.GetLogRepository();
                
                repo.Create(new Log
                {
                  LevelId = 1,
                  Thread = "",
                  Location = "Manual Creation",
                  Message = "This is manually created log.",
                  CreateTime = DateTimeOffset.Now,
                  Date = DateTime.Now
                });
                
                uow.Commit();

                從UnitOfWork里得到一個或多個Repository,共享DBContext,做增刪改操作,最后uow統一SaveChanges。

                Repository的派生類

                由于已經有了AbstractRepository,實現了增刪改查的很多方法,所以派生類,例如示例項目里的LogRepository基本就可以變得很簡單,主要實現一些特定的業務邏輯,在示例項目里,因為沒有特殊的業務邏輯,所以會很簡單:

                public class LogRepository : AbstractRepository<Log, int>
                  {
                    public LogRepository(EFContext context)
                      : base(context)
                    {
                    }
                  }

                關于Entity的生成

                本人比較喜歡Database First 實現,先設計數據庫,然后用edmx reverse engineering,生成POCO??梢詤⒖糆ntity目錄下的相關文件。

                當然,如果你喜歡Code First,同樣沒有問題,仍然適用本文的實現。

                使用Logging日志追蹤EF SQL

                在使用Entity Framework的時候,最好關心一下EF所生成的SQL,這樣可以在開發階段發現一些潛在的性能問題,避免在生產環境焦頭爛額:)

                在Common\EFContext.cs 里,有一個配置項EnableTraceSql,如果為true,那么所以EF生成的SQL將會被nlog記錄下來。我將nlog的日志配置到了數據庫。也就是說,在你運行示例項目時,每次查詢,都會增加新的日志記錄,內容為查詢時生成的SQL:

                Specification Pattern

                在查詢方法里,有個重載是接受一個ISpecification示例,這樣的實現可以有效的控制業務邏輯,對于寫給被其他人調用的接口來說,可以明確的確定查詢參數,例如:

                public class LogSearchSpecification : ISpecification<Log>
                  {
                    public string LevelName { get; set; }
                    public string Message { get; set; }
                    public Expression<Func<Log, bool>> ToExpression()
                    {
                      return log => (log.Level.Name == LevelName || LevelName == "") &&
                             (log.Message.Contains(Message) || Message == "");
                    }
                
                    public bool IsSatisfiedBy(Log entity)
                    {
                      return (entity.Level.Name == LevelName || LevelName == "") &&
                          (entity.Message.Contains(Message) || Message == "");
                    }
                  }

                那么,調用這個查詢方法的代碼就可以明確知道,我的查詢條件為LevelName和Message,至于LevelName是等于以及Message為Like則是在LogSearchSpeficiation里實現,做到很好的封裝。

                最后

                這套實現是幾年來平時慢慢積累的,是經過實踐的,所以應該可以作為一定的參考,當然,在具體的項目里,可以用一些DI去拿到Repository等等,不在本文討論范圍,大家可以自由發揮,希望對大家可以有所幫助,謝謝。

                無數據提示還沒有評論,樓主喊你快去搶前排~~~我要評論
                微信掃碼登陸

                打開 微信
                掃一掃登錄

                phpstudy使用視頻教程 pk牛牛平台总代 http://www.youdao.com/w/久发在线娱乐官网a9840。com 复制登录 http://so.iqiyi.com/pps/?k=手机怎么没彩票a9840。com 复制登录 http://cn.engadget.com/tag/上海市福利彩票住址28c63。com 复制登录 http://so.iqiyi.com/pps/?k=随时赚彩票是什么网站a9840。com 复制登录 http://www.xiachufang.com/search/?keyword=pk10三星免费缩水软件a9840。com 复制登录 http://www.youdao.com/w/广东快乐十分任选三a9840。com 复制登录 http://so.iqiyi.com/pps/?k=幸运飞艇猜冠军追号计划a9840。com 复制登录 http://www.xiachufang.com/search/?keyword=广东快乐十分走a9840。com 复制登录 http://www.douban.com/search?q=pk10开奖历史记录下载a9840。com 复制登录 http://cn.engadget.com/tag/秒速时时彩人工计划28c63。com 复制登录 http://so.iqiyi.com/so/q_北京pk十彩票投注技巧a9840。com 复制登录 http://www.xiachufang.com/search/?keyword=pk10赛车appa9840。com 复制登录 http://www.douban.com/search?q=北京pk10改单是什么a9840。com 复制登录 http://cn.engadget.com/tag/浙江体育彩票开奖视频28c63。com 复制登录 http://so.iqiyi.com/pps/?k=奔驰彩票软件是真的么a9840。com 复制登录 http://www.xiachufang.com/search/?keyword=广东快乐十分公式a9840。com 复制登录 http://www.douban.com/search?q=极速赛车pk10专业数据a9840。com 复制登录 http://cn.engadget.com/tag/幸运飞艇七码码28c63。com 复制登录 http://so.iqiyi.com/so/q_秒速赛车的网站是什么a9840。com 复制登录 http://so.iqiyi.com/pps/?k=pk10模拟投注器a9840。com 复制登录 http://www.douban.com/search?q=广东快乐十分现场视频a9840。com 复制登录 http://www.youdao.com/w/彩经彩票a9840。com 复制登录 http://so.iqiyi.com/so/q_北京赛车怎样拉玩家a9840。com 复制登录 http://so.iqiyi.com/pps/?k=888彩票娱乐平台a9840。com 复制登录 http://www.xiachufang.com/search/?keyword=ABC是什么彩票平台a9840。com 复制登录 http://www.youdao.com/w/体育彩票下期预测号码a9840。com 复制登录 http://so.iqiyi.com/pps/?k=幸运飞艇9码公式a9840。com 复制登录 http://www.xiachufang.com/search/?keyword=彩票报纸a9840。com 复制登录 http://www.douban.com/search?q=北京赛车pk10最新开奖记录a9840。com 复制登录 http://cn.engadget.com/tag/免费幸运飞艇计划l软件28c63。com 复制登录 http://so.iqiyi.com/so/q_4d马来西亚彩票a9840。com 复制登录 http://www.xiachufang.com/search/?keyword=中国体育彩票门头图片a9840。com 复制登录 http://cn.engadget.com/tag/重庆幸运农场开奖几次?28c63。com 复制登录 http://so.iqiyi.com/so/q_福彩双色球彩票a9840。com 复制登录 http://www.xiachufang.com/search/?keyword=幸运飞艇8码算法a9840。com 复制登录 http://www.youdao.com/w/全天免费幸运飞艇计划a9840。com 复制登录 http://cn.engadget.com/tag/福利彩票快乐十分28c63。com 复制登录 http://so.iqiyi.com/pps/?k=幸运飞艇有靓计划吗a9840。com 复制登录 http://www.xiachufang.com/search/?keyword=cp彩票平台可信么a9840。com 复制登录 http://www.douban.com/search?q=春节彩票不开门a9840。com 复制登录 http://cn.engadget.com/tag/大玩家出彩票最多机子28c63。com 复制登录 http://so.iqiyi.com/so/q_彩票追号套餐a9840。com 复制登录 http://www.xiachufang.com/search/?keyword=官方彩票娱乐平台大全a9840。com 复制登录 http://www.douban.com/search?q=彩票商务代领a9840。com 复制登录 http://cn.engadget.com/tag/幸运农场大小走势图表28c63。com 复制登录 http://so.iqiyi.com/so/q_欢乐彩票appa9840。com 复制登录 http://www.xiachufang.com/search/?keyword=彩票平台排行榜第一a9840。com 复制登录 http://www.douban.com/search?q=吉林市幸运飞艇微信群a9840。com 复制登录 http://www.youdao.com/w/网购彩票哪个网站正规a9840。com 复制登录 http://cn.engadget.com/tag/幸运pk10快艇微信群28c63。com 复制登录 http://so.iqiyi.com/pps/?k=秒速赛车技巧钱啊a9840。com 复制登录 http://www.xiachufang.com/search/?keyword=百合娱乐彩票怎么样a9840。com 复制登录 http://www.douban.com/search?q=2分pk10a9840。com 复制登录 http://so.iqiyi.com/so/q_幸运农场实时走势图a9840。com 复制登录 http://so.iqiyi.com/pps/?k=彩票软件合法吗a9840。com 复制登录 http://www.douban.com/search?q=天盈网投彩票a9840。com 复制登录 http://www.youdao.com/w/秒速赛车计划统计a9840。com 复制登录 http://cn.engadget.com/tag/买多少彩票才给送票28c63。com 复制登录 http://www.xiachufang.com/search/?keyword=手机北京pk10计划软件a9840。com 复制登录 http://www.youdao.com/w/广东快乐十分彩彩乐a9840。com 复制登录 http://cn.engadget.com/tag/滴滴彩票安卓版28c63。com 复制登录 http://so.iqiyi.com/pps/?k=天天乐购彩票a9840。com 复制登录 http://www.xiachufang.com/search/?keyword=广东快乐十分软件杀号a9840。com 复制登录 http://www.douban.com/search?q=北京pk十彩票投注技巧a9840。com 复制登录 http://cn.engadget.com/tag/幸运飞艇pk10杀码方法28c63。com 复制登录 http://so.iqiyi.com/so/q_引流别人玩彩票a9840。com 复制登录 http://www.xiachufang.com/search/?keyword=500vip彩票网安卓a9840。com 复制登录 http://www.youdao.com/w/彩票老板a9840。com 复制登录 http://so.iqiyi.com/so/q_重庆幸运农场视频a9840。com 复制登录 http://so.iqiyi.com/pps/?k=如何买到彩票指南报纸a9840。com 复制登录 http://www.youdao.com/w/下载广东快乐十分a9840。com 复制登录 http://so.iqiyi.com/pps/?k=幸运飞艇跟北京pk一样吗a9840。com 复制登录 http://www.douban.com/search?q=微信幸运飞艇a9840。com 复制登录 http://www.youdao.com/w/彩票投注翻倍公式a9840。com 复制登录 http://cn.engadget.com/tag/13723小鱼儿主页28c63。com 复制登录 http://so.iqiyi.com/pps/?k=最精准的北京赛车冠亚计划网a9840。com 复制登录 http://www.xiachufang.com/search/?keyword=彩票玩法大全a9840。com 复制登录 http://www.douban.com/search?q=北京赛车pk10简单杀号a9840。com 复制登录 http://cn.engadget.com/tag/幸运飞艇计划7码28c63。com 复制登录 http://so.iqiyi.com/so/q_彩乐网天下彩天空彩与你同行a9840。com 复制登录 http://www.xiachufang.com/search/?keyword=青蛙彩票开奖结果a9840。com 复制登录 http://www.youdao.com/w/700万彩票网合法吗a9840。com 复制登录 http://cn.engadget.com/tag/买哪种彩票最靠谱28c63。com 复制登录 http://so.iqiyi.com/pps/?k=科学玩pk10a9840。com 复制登录 http://www.xiachufang.com/search/?keyword=天天中彩票怎么当大神a9840。com 复制登录 http://www.douban.com/search?q=北京体彩pk10a9840。com 复制登录 http://cn.engadget.com/tag/幸运飞艇经历28c63。com 复制登录 http://so.iqiyi.com/so/q_象彩票注册登陆官网a9840。com 复制登录 http://www.xiachufang.com/search/?keyword=比利时分分彩人工计划a9840。com 复制登录 http://www.douban.com/search?q=顺龙pk10a9840。com 复制登录 http://cn.engadget.com/tag/怎么在手机上买彩票啊28c63。com 复制登录 http://so.iqiyi.com/so/q_北京pk10 极限a9840。com 复制登录 http://www.xiachufang.com/search/?keyword=幸运农场走势图重庆彩票网a9840。com 复制登录 http://www.douban.com/search?q=彩票365是否合法?a9840。com 复制登录 http://cn.engadget.com/tag/广东快乐十分直播现场28c63。com 复制登录 http://so.iqiyi.com/so/q_米兜彩票怎么样a9840。com 复制登录 http://www.xiachufang.com/search/?keyword=卓易彩票不能注册a9840。com 复制登录 http://www.douban.com/search?q=帝豪彩票总代理a9840。com 复制登录 http://www.youdao.com/w/北京赛车pk10一天多少期a9840。com 复制登录 http://so.iqiyi.com/so/q_最新的118彩票软件a9840。com 复制登录 http://so.iqiyi.com/pps/?k=2019网络彩票开放a9840。com 复制登录 http://www.douban.com/search?q=幸运农场赔率a9840。com 复制登录 http://cn.engadget.com/tag/广东快乐十分彩开奖号28c63。com 复制登录 http://so.iqiyi.com/pps/?k=中国最有名的彩票专家a9840。com 复制登录 http://www.douban.com/search?q=幸运飞艇8码公式a9840。com 复制登录 http://www.youdao.com/w/会员注册-703彩票a9840。com 复制登录 http://cn.engadget.com/tag/pk10彩票28c63。com 复制登录 http://so.iqiyi.com/pps/?k=幸运飞艇大小走势图彩控a9840。com 复制登录 http://www.xiachufang.com/search/?keyword=彩票人工计划软件a9840。com 复制登录 http://www.douban.com/search?q=体育彩票篮球推荐a9840。com 复制登录 http://cn.engadget.com/tag/幸运飞艇二维码群28c63。com 复制登录 http://so.iqiyi.com/so/q_广东快乐十分11选5开奖结果a9840。com 复制登录 http://www.xiachufang.com/search/?keyword=时时彩钻石版a9840。com 复制登录 http://www.douban.com/search?q=北京快乐8开奖直播现场a9840。com 复制登录 http://www.youdao.com/w/广东快乐十分前三组图表a9840。com 复制登录 http://www.xiachufang.com/search/?keyword=幸运飞艇信誉老群a9840。com 复制登录 http://www.douban.com/search?q=重庆福彩幸运农场开奖a9840。com 复制登录 http://www.youdao.com/w/时时中彩票官网手机a9840。com 复制登录 http://cn.engadget.com/tag/福利彩票35选7开奖号码28c63。com 复制登录 http://so.iqiyi.com/pps/?k=重庆幸运农场app下载a9840。com 复制登录 http://www.xiachufang.com/search/?keyword=中彩网可以买彩票吗a9840。com 复制登录 http://www.douban.com/search?q=北京pk10龙虎技巧a9840。com 复制登录 http://cn.engadget.com/tag/uc彩票可靠不28c63。com 复制登录 http://so.iqiyi.com/pps/?k=幸运飞艇怎么充值a9840。com 复制登录 http://www.xiachufang.com/search/?keyword=111彩票网是真的吗a9840。com 复制登录 http://www.douban.com/search?q=宏光彩票网站a9840。com 复制登录 http://cn.engadget.com/tag/幸运飞艇前三号码分布基本28c63。com 复制登录 http://so.iqiyi.com/so/q_ba娱乐平台代理a9840。com 复制登录 http://www.xiachufang.com/search/?keyword=体育彩票11远5怎么玩a9840。com 复制登录 http://so.iqiyi.com/pps/?k=秒速赛车开奖直播软件下载a9840。com 复制登录 http://www.xiachufang.com/search/?keyword=大公鸡彩票平台真吗a9840。com 复制登录 http://www.youdao.com/w/幸运农场手机版a9840。com 复制登录 http://so.iqiyi.com/so/q_银豹彩票网址a9840。com 复制登录 http://so.iqiyi.com/pps/?k=广东快乐十分杀号公式a9840。com 复制登录 http://www.xiachufang.com/search/?keyword=703彩票注册软件a9840。com 复制登录 http://www.douban.com/search?q=pk10专家大小预测a9840。com 复制登录 http://cn.engadget.com/tag/快乐十分软件28c63。com 复制登录 http://so.iqiyi.com/so/q_彩票员每天做些什么a9840。com 复制登录 http://www.xiachufang.com/search/?keyword=守财奴时时彩冷热a9840。com 复制登录 http://www.douban.com/search?q=手机app可以买彩票吗a9840。com 复制登录 http://cn.engadget.com/tag/北京赛车pk10稳定杀号28c63。com 复制登录 http://www.xiachufang.com/search/?keyword=青蛙彩票开奖下载a9840。com 复制登录 http://www.douban.com/search?q=如何玩pk10a9840。com 复制登录 http://so.iqiyi.com/so/q_黄金北京pk10计划软件a9840。com 复制登录 http://www.xiachufang.com/search/?keyword=彩票上海快3开奖a9840。com 复制登录 http://www.douban.com/search?q=688彩票a9840。com 复制登录 http://cn.engadget.com/tag/重庆幸运农场复式玩法28c63。com 复制登录 http://so.iqiyi.com/so/q_大发云彩票系统怎么开a9840。com 复制登录 http://www.xiachufang.com/search/?keyword=幸运飞艇全天网页计划a9840。com 复制登录 http://www.douban.com/search?q=北京赛车pk10预测a9840。com 复制登录 http://cn.engadget.com/tag/重庆幸运农场定胆公式28c63。com 复制登录 http://so.iqiyi.com/so/q_彩宝 彩票 微信a9840。com 复制登录 http://www.xiachufang.com/search/?keyword=幸运飞艇技巧交流群a9840。com 复制登录 http://www.douban.com/search?q=海南彩票网海口彩版808a9840。com 复制登录 http://cn.engadget.com/tag/幸运飞艇走势软件28c63。com 复制登录 http://so.iqiyi.com/so/q_彩票 判刑a9840。com 复制登录 http://www.xiachufang.com/search/?keyword=爱乐时时彩不能提款a9840。com 复制登录 http://www.douban.com/search?q=浙江体育彩票11选五a9840。com 复制登录 http://www.youdao.com/w/广东快乐十分推荐任3a9840。com 复制登录 http://so.iqiyi.com/so/q_重庆幸运农场秘诀a9840。com 复制登录 http://so.iqiyi.com/pps/?k=T6娱乐注册a9840。com 复制登录 http://www.xiachufang.com/search/?keyword=北京pk10彩票规律a9840。com 复制登录 http://www.youdao.com/w/如何玩秒速赛车赢a9840。com 复制登录 http://cn.engadget.com/tag/哪些平台可以网购彩票28c63。com 复制登录 http://so.iqiyi.com/pps/?k=幸运飞艇庄家赢率a9840。com 复制登录 http://www.xiachufang.com/search/?keyword=官网广东快乐十分a9840。com 复制登录 http://www.douban.com/search?q=虚拟彩票游戏a9840。com 复制登录 http://cn.engadget.com/tag/幸运飞艇精准5码28c63。com 复制登录 http://so.iqiyi.com/so/q_998彩票a9840。com 复制登录 http://so.iqiyi.com/pps/?k=pk10技巧玩法a9840。com 复制登录 http://www.douban.com/search?q=彩票直播在哪个软件a9840。com 复制登录 http://www.youdao.com/w/天天中彩票安不安全a9840。com 复制登录 http://cn.engadget.com/tag/pk10葡萄软件手机28c63。com 复制登录 http://so.iqiyi.com/pps/?k=秒速赛车网址注册a9840。com 复制登录 http://www.xiachufang.com/search/?keyword=cp彩票平台可信么a9840。com 复制登录 http://www.douban.com/search?q=北京pk网络彩票a9840。com 复制登录 http://cn.engadget.com/tag/幸运农场5红是那些号码28c63。com 复制登录 http://so.iqiyi.com/pps/?k=幸运农场计划软件手机版a9840。com 复制登录 http://www.xiachufang.com/search/?keyword=广东快乐十分定胆图a9840。com 复制登录 http://www.douban.com/search?q=三d彩票开奖一周号码a9840。com 复制登录 http://www.youdao.com/w/pk10在线缩水a9840。com 复制登录 http://so.iqiyi.com/so/q_新时时彩是哪个地区的a9840。com 复制登录 http://so.iqiyi.com/pps/?k=幸运飞艇人工单双在线计划a9840。com 复制登录 http://www.xiachufang.com/search/?keyword=重庆彩票幸运农场开奖结果走势图a9840。com 复制登录 http://www.douban.com/search?q=红利彩票官网a9840。com 复制登录 http://www.youdao.com/w/黄金彩票平台安全吗a9840。com 复制登录 http://so.iqiyi.com/so/q_怎样在直播平台买彩票a9840。com 复制登录 http://so.iqiyi.com/pps/?k=今天重庆幸运农场开奖走势图a9840。com 复制登录 http://www.xiachufang.com/search/?keyword=广东快乐十分11选5开奖a9840。com 复制登录 http://www.douban.com/search?q=pk10传码规律a9840。com 复制登录 http://so.iqiyi.com/so/q_北京pk10计划免费软件a9840。com 复制登录 http://www.xiachufang.com/search/?keyword=幸运农场开奖号码a9840。com 复制登录 http://www.douban.com/search?q=官方手机投注彩票软件a9840。com 复制登录 http://www.youdao.com/w/北京pk10做号软件下载a9840。com 复制登录 http://so.iqiyi.com/so/q_谁有幸运飞艇投注a9840。com 复制登录 http://so.iqiyi.com/pps/?k=广东快乐十分缩水a9840。com 复制登录 http://www.xiachufang.com/search/?keyword=乐都彩票是真的吗a9840。com 复制登录 http://www.douban.com/search?q=2019年彩票开售时间a9840。com 复制登录 http://www.youdao.com/w/北京赛车pk10开奖网a9840。com 复制登录 http://so.iqiyi.com/so/q_038彩票网可靠吗a9840。com 复制登录