回到目录

对于MongoDB的封装还在继续,对于不断追求简单的编程还在继续,对于喜欢代码的那么感觉,还在继续...

当你的mongo数据表里有子对象时,尤其是列表对象时,使用官方的驱动很是不爽,要记得很多新的对象类型,麻烦,所以,将它进行封装,让GetModel支持匿名参数!

表结构可能是这样

希望查询的语句变成这样

看了上面的语句感觉挺酷吧,呵呵,下面看一下实现的代码,今天下午写的,呵呵!

  public IEnumerable<TEntity> GetModel<U>(U template){return _table.Find(GeneratorMongoQuery(template)).ToListAsync().Result;}public PagedResult<TEntity> GetModel<U>(int pageIndex, int pageSize){return this.GetModel(new { }, pageIndex, pageSize);}public PagedResult<TEntity> GetModel<U>(U template, int pageIndex, int pageSize){return this.GetModel(template, new { }, pageIndex, pageSize);}public PagedResult<TEntity> GetModel<U, O>(U template, O orderby, int pageIndex, int pageSize){#region 条件过滤BsonDocumentFilterDefinition<TEntity> filterDefinition = GeneratorMongoQuery(template);#endregion#region 排序处理SortDefinition<TEntity> sorts = new ObjectSortDefinition<TEntity>(new { });foreach (var item in typeof(O).GetProperties()){if ((OrderType)item.GetValue(orderby) == OrderType.Asc)sorts = sorts.Ascending(item.Name);elsesorts = sorts.Descending(item.Name);}#endregion#region 分页处理var skip = (pageIndex - 1) * pageSize;var recordCount = _table.Find(filterDefinition).CountAsync(new CancellationToken()).Result;var limit = pageSize;return new PagedResult<TEntity>(recordCount,(int)(recordCount + pageSize - 1) / pageSize,pageSize,pageIndex,_table.Find(filterDefinition).Sort(sorts).Skip(skip).Limit(limit).ToListAsync().Result);#endregion}

提出了一个条件过滤的私有方法,因为它的逻辑在两个方法里都用了,所以进行提取

   /// <summary>/// 构建Mongo的查询表达式,通过一个匿名对象/// </summary>/// <typeparam name="U"></typeparam>/// <param name="template"></param>/// <returns></returns>private BsonDocumentFilterDefinition<TEntity> GeneratorMongoQuery<U>(U template){var qType = typeof(U);var outter = new BsonDocument();var simpleQuery = new BsonDocument();foreach (var item in qType.GetProperties()){if (item.PropertyType.IsClass && item.PropertyType != typeof(string)){//复杂类型,导航属性,类对象和集合对象 foreach (var sub in item.PropertyType.GetProperties()){simpleQuery.Add(new BsonElement(item.Name + "." + sub.Name,BsonValue.Create(sub.GetValue(item.GetValue(template)))));}}else{//简单类型,ValueType和stringsimpleQuery.Add(new BsonElement(item.Name,BsonValue.Create(item.GetValue(template))));}}return new BsonDocumentFilterDefinition<TEntity>(simpleQuery);}

结果就是我们想好的,怎么样,用法挺友好吧

回到目录

MongoDB学习笔记~以匿名对象做为查询参数,方便查询子对象相关推荐

  1. Java 学习笔记(8)——匿名对象与内部类

    一般在编写代码时可能会遇到这样的场景--在某些时候,我需要定义并某个类,但是只会使用这一次,或者是某个类对象只会使用一次,为它们专门取名可能会显的很麻烦.为了应对这种情况,Java中允许使用匿名对象和 ...

  2. 第17天学习Java的笔记(匿名对象,随机数,猜数字小游戏)

    33天! 匿名对象 package Demo1701;public class Person {String name;public void showName() {System.out.print ...

  3. MongoDB学习笔记(一) MongoDB介绍及安装

    系列目录 MongoDB学习笔记(一) MongoDB介绍及安装     MongoDB学习笔记(二) 通过samus驱动实现基本数据操作     MongoDB学习笔记(三) 在MVC模式下通过Jq ...

  4. MongoDB学习笔记~对集合属性的操作

    $unset清除元素 请注意在单个数组元素上使用$unset的结果可能与你设想的不一样.其结果只是将元素的值设置为null,而非删除整个元素.要想彻底删除某个数组元素,可以用$pull 和$pop操作 ...

  5. [学习笔记] Cordova+AmazeUI+React 做个通讯录 - 单页应用 (With Router)

    [学习笔记] Cordova+AmazeUI+React 做个通讯录 系列文章 目录 准备 联系人列表(1) 联系人列表(2) 联系人详情 单页应用 (With Router) 使用 SQLite 传 ...

  6. MongoDB学习笔记(四)使用Java进行实时监控与数据收集(空间使用量、连接数)

    目录: MongoDB学习笔记(一)环境搭建与常用操作 MongoDB学习笔记(二)使用Java操作MongoDB MongoDB学习笔记(三)使用Spring Data操作MongoDB Mongo ...

  7. PHP操作MongoDB学习笔记

    PHP操作MongoDB技術總結 <?php /** * PHP操作MongoDB学习笔记 */ //************************* //**   连接MongoDB数据库  ...

  8. [学习笔记] Cordova+AmazeUI+React 做个通讯录 - 使用 SQLite

    [学习笔记] Cordova+AmazeUI+React 做个通讯录 系列文章 目录 准备 联系人列表(1) 联系人列表(2) 联系人详情 单页应用 (With Router) 使用 SQLite 传 ...

  9. 非关系型数据库MongoDB学习笔记

    MongoDB学习笔记   --周灿 创建数据库 use "databasename" 查看数据库 show dbs 给指定数据库添加集合和插入记录 db.集合名.insert({ ...

最新文章

  1. 10分钟搭建你的第一个图像识别模型 | 附完整代码
  2. Scrum中文网-是否需要在Sprint计划会上分完所有任务?
  3. SQLSERVER存储过程基本语法
  4. Ignite与Spark集成时,ClassNotFoundException问题解决
  5. javascript 将内容复制到剪贴板
  6. 贷款,别相信这些人!
  7. (原)学习ORACLE 视图
  8. 【数学】礼物(jzoj 2129)
  9. 第一百二十八期:推荐几个IDEA插件,Java开发者撸码利器,你get到了吗
  10. Git仓库迁移,包括所有的分支、标签、日志
  11. leetcode - 494. 目标和
  12. CentOS 利用Yum安装mysql后无法启动(MySQL Daemon failed to start.)
  13. Selenium 脚本稳定性问题
  14. Ubuntu | ubuntu下安装edge
  15. 3gqq幻想西游〓宠物、副本、攻略、攻城、极品怪〓
  16. 我干区块链这一月,见证从风口到“枪口”
  17. 【优化理论与方法】线性规划的基本定理
  18. 解决网页在浏览器有反应 在手机端没反应问题
  19. 【1011】甲流疫情死亡率
  20. (附源码)spring boot大学生综合素质测评系统 毕业设计162308

热门文章

  1. python中int用法,Python中int()函数的用法浅析
  2. java 私有成员方法_Java Reflection 教程(7):类私有成员变量和方法
  3. 下来安成功 打开一直白屏_苹果手机白屏怎么解决啊,苹果手机白屏了怎么修复...
  4. linux判断redis是否启动成功_redis的前生后世
  5. c# list集合根据某个字段去重_java8 List 根据对象某个字段或多个字段去重、筛选、List转Map、排序、分组、统计计数等等...
  6. 计算机英语讲课笔记01
  7. 如何使用反意疑问句来确认请求_24
  8. word vba 读出光标所在的列数_word高效技巧:这几个表格操作让工作更快速
  9. 2017.10.7 最长上升子序列 思考记录
  10. 【英语学习】【WOTD】animadversion 释义/词源/示例