最近开始学习Mongodb方面的东西..

看到有很多博主都说MongoDB的第三方驱动 Samus 对Linq的支持比较好..能够降低学习的成本..所以就想从这里开始..

但是弊端在我学习了一半的时候才发现..很严重..Samus驱动对数据库的操作没有返回值..增删改都没有..只有查询有结果..

这在很多时候都不能允许的..因为我们必须知道这一步是否操作成功才能够安全的进入下一步..

不过我还是硬着头皮写完了一套增删改查的工具方法..在这里共享一下..也作为一个记录..

至于具体放在什么地方使用..就要智者见智了..譬如操作日志的存储..

废话不多说..直接上代码..

这里边有部分代码都是从别处Copy来的..但却又自成体系..有作者路过的请留言..

Entity类

EntityBase:  是所有实体对象的基类..要求所有的实体都继承于他

Person:   实体对象. 不必再定义_ID..属性必须显示定义..也就是说必须都写{get;set;} 因为我们后边有一个OrderBy动态排序要求使用类的公共属性

    /// <summary>
/// 对象基类..所有对象都继承于该类
/// </summary>
public class EntityBase
{
public string _id { get; set; }
} /// <summary>
/// 用户实体类 实体类里不用定义ID..基类里定义过了 <例>
/// </summary>
class Person : EntityBase
{
public Person()
{
//创建新对象时..直接自生产新 _ID
_id = MongoUtil.NewObjectId();
}
public string NN { get; set; }
public int Age { get; set; }
}

DBHelper类   (比较长)

增删改:  这里边Insert  Delete  Update都写成了扩展方法..可以直接使用

可以这样用..  Person.DB_Delete()  来删除  支持 List<Person>.DB_Delete() 删除

    具体的可以仔细查看一下..

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; using MongoDB;
using MongoDB.Util;
using MongoDB.GridFS;
using MongoDB.Commands;
using MongoDB.Results;
using System.Linq.Expressions;
using System.Reflection; namespace Sam
{
public static class MongoU
{
#region //Query /// <summary>
/// 查找对象
/// </summary>
/// <param name="document">筛选条件</param>
/// <returns></returns>
public static TT FindOne<TT>(Document document) where TT : EntityBase
{
using (Mongo mon = new Mongo(Config.ConnString))
{
mon.Connect();
var table = mon.GetDatabase(Config._dbName).GetCollection<TT>(typeof(TT).Name);
return table.FindOne(document);
}
} /// <summary>
/// 查找对象
/// </summary>
/// <param name="predicate">Lambda 表达式</param>
/// <returns></returns>
public static TT FindOne<TT>(Expression<Func<TT, bool>> predicate) where TT : EntityBase
{
using (Mongo mon = new Mongo(Config.ConnString))
{
mon.Connect();
var table = mon.GetDatabase(Config._dbName).GetCollection<TT>(typeof(TT).Name);
var result = table.Find<TT>(predicate).Documents;
return result.Count() != ? result.First<TT>() : null;
}
} /// <summary>
/// 查找列表
/// </summary>
/// <param name="document">筛选条件</param>
/// <returns></returns>
public static List<TT> Find<TT>(Document document) where TT : EntityBase
{
using (Mongo mon = new Mongo(Config.ConnString))
{
mon.Connect();
var table = mon.GetDatabase(Config._dbName).GetCollection<TT>(typeof(TT).Name);
return table.Find(document).Documents.ToList();
}
} /// <summary>
/// 查找列表
/// </summary>
/// <param name="predicate">Lambda 表达式</param>
/// <returns></returns>
public static List<TT> Find<TT>(Expression<Func<TT, bool>> predicate) where TT : EntityBase
{
using (Mongo mon = new Mongo(Config.ConnString))
{
mon.Connect();
var table = mon.GetDatabase(Config._dbName).GetCollection<TT>(typeof(TT).Name);
return table.Find<TT>(predicate).Documents.ToList();
}
} /// <summary>
/// 分页查找
/// </summary>
/// <param name="Exp1">Lambda 表达式</param>
/// <param name="OrderFiled">排序列</param>
/// <param name="isAsc">是否正序排列 True为Asc Flase为Desc</param>
/// <param name="PageIndex">页码</param>
/// <param name="PageCount">页尺寸</param>
/// <returns></returns>
public static List<TT> FindByPage<TT>(Expression<Func<TT, bool>> Exp1, string OrderFiled, bool isAsc, int PageIndex, int PageCount) where TT : EntityBase
{
using (Mongo mon = new Mongo(Config.ConnString))
{
mon.Connect();
var table = mon.GetDatabase(Config._dbName).GetCollection<TT>(typeof(TT).Name);
//动态属性排序
return table.Linq().Where(Exp1).OrderByDynamic<TT>(OrderFiled, isAsc).Skip((PageIndex - ) * PageCount).Take(PageCount).ToList();
}
}
#endregion #region //Delete /// <summary>
/// 根据规则删除
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="predicate"></param>
public static void DB_Delete<TT>(this TT source) where TT : EntityBase
{
if (source == null) return;
using (Mongo mon = new Mongo(Config.ConnString))
{
mon.Connect();
var table = mon.GetDatabase(Config._dbName).GetCollection<TT>(typeof(TT).Name);
table.Remove(new Document().Add("_id", source._id), true);
}
} /// <summary>
/// 根据规则删除
/// </summary>
/// <typeparam name="TT"></typeparam>
/// <param name="predicate"></param>
public static void DB_Delete<TT>(this List<TT> source) where TT : EntityBase
{
if (source == null | source.Count() == ) return;
using (Mongo mon = new Mongo(Config.ConnString))
{
mon.Connect();
var table = mon.GetDatabase(Config._dbName).GetCollection<TT>(typeof(TT).Name);
var list = new List<string>();
foreach (var item in source)
{
list.Add(item._id);
}
table.Remove(new Document().Add("_id", MongoDB.Op.In(list.ToArray())), true); }
} public static void DB_Delete<TT>(Document document) where TT : EntityBase
{
using (Mongo mon = new Mongo(Config.ConnString))
{
mon.Connect();
var table = mon.GetDatabase(Config._dbName).GetCollection<TT>(typeof(TT).Name);
table.Remove(document, true);
}
} public static void DB_Delete<TT>(Expression<Func<TT,bool>> Exp1) where TT : EntityBase
{
using (Mongo mon = new Mongo(Config.ConnString))
{
mon.Connect();
var table = mon.GetDatabase(Config._dbName).GetCollection<TT>(typeof(TT).Name);
table.Remove(Exp1, true);
}
} #endregion #region //Modify /// <summary>
/// 修改单个对象 根据_id修改
/// </summary>
/// <param name="obj"></param>
public static void DB_Update<TT>(this TT source) where TT : EntityBase
{
using (Mongo mon = new Mongo(Config.ConnString))
{
mon.Connect();
var table = mon.GetDatabase(Config._dbName).GetCollection<TT>(typeof(TT).Name);
table.Update(source, new { _id = source._id }, true);
}
}
#endregion #region //Add /// <summary>
/// 添加一条数据到 Mongo
/// </summary>
/// <typeparam name="T">添加的对象类型</typeparam>
/// <param name="entity">添加的对象</param>
/// <returns>操作结果 来源为判断异步任务是否因异常或者取消动作而完成,是的话返回False</returns>
public static void DB_Insert<TT>(this TT source) where TT : EntityBase
{
using (Mongo mon = new Mongo(Config.ConnString))
{
mon.Connect();
var table = mon.GetDatabase(Config._dbName).GetCollection<TT>(typeof(TT).Name);
table.Insert(source, true);
}
} /// <summary>
/// 同时添加多条数据到 Mongo
/// </summary>
/// <typeparam name="TT">添加的对象类型</typeparam>
/// <param name="entities">对象的集合</param>
/// <returns>操作结果 来源为判断异步任务是否因异常或者取消动作而完成,是的话返回False</returns>
public static void DB_Insert<TT>(IEnumerable<TT> entities) where TT : EntityBase
{
using (Mongo mon = new Mongo(Config.ConnString))
{
mon.Connect();
var table = mon.GetDatabase(Config._dbName).GetCollection<TT>(typeof(TT).Name);
table.Insert(entities, true);
}
}
#endregion
}
}

MongoUtil  自动生成ObjectId

静态方法:  String _id= MongoUtil.NewObjectId()  可以生成出来新的不会重复Id

namespace Sam
{
internal static class MongoUtil
{
private static readonly DateTime Epoch = new DateTime(, , , , , , DateTimeKind.Utc);
private static readonly object _innerLock = new object();
private static int _counter;
private static readonly byte[] _machineHash = MD5.Create().ComputeHash(Encoding.Default.GetBytes(Dns.GetHostName()));
private static readonly byte[] _processId = BitConverter.GetBytes(Process.GetCurrentProcess().Id); public static string NewObjectId()
{
var oid = new byte[];
var copyidx = ; Array.Copy(_machineHash, , oid, copyidx, );
copyidx += ; Array.Copy(_processId, , oid, copyidx, );
copyidx += ; Array.Copy(BitConverter.GetBytes(GenerateTime()), , oid, copyidx, );
copyidx += ; Array.Copy(BitConverter.GetBytes(GenerateCounter()), , oid, copyidx, ); StringBuilder strBuilder = new StringBuilder();
foreach (byte bt in oid)
{
strBuilder.AppendFormat("{0:X2}", bt);
} return strBuilder.ToString().ToLower();
} private static int GenerateTime()
{
var now = DateTime.UtcNow;
var nowtime = new DateTime(Epoch.Year, Epoch.Month, Epoch.Day,now.Hour, now.Minute, now.Second, now.Millisecond);
var diff = nowtime - Epoch;
return Convert.ToInt32(Math.Floor(diff.TotalMilliseconds));
} private static int GenerateCounter()
{
lock (_innerLock)
{
return _counter++;
}
}
} }

OrderBy 或  OrderByDescending  的动态排序

    public static class Extended
{ #region //动态排序 /// <summary>
/// 动态OrderBy
/// </summary>
/// <typeparam name="TT">TT要求是继承了EntityBase的实体类型</typeparam>
/// <param name="source">操作源</param>
/// <param name="propertyStr">要用来排序的属性名</param>
/// <param name="isAsc">正序排 True 倒叙排 False</param>
/// <returns></returns>
public static IQueryable<TT> OrderByDynamic<TT>(this IQueryable<TT> source, string propertyStr, bool isAsc) where TT : class
{
ParameterExpression param = Expression.Parameter(typeof(TT), "c");
PropertyInfo property = typeof(TT).GetProperty(propertyStr);
Expression propertyAccessExpression = Expression.MakeMemberAccess(param, property);
LambdaExpression le = Expression.Lambda(propertyAccessExpression, param);
Type type = typeof(TT);
MethodCallExpression resultExp = Expression.Call(typeof(Queryable), (isAsc ? "OrderBy" : "OrderByDescending"), new Type[] { type, property.PropertyType }, source.Expression, Expression.Quote(le));
return source.Provider.CreateQuery<TT>(resultExp);
}
#endregion
}

大的框架就是这样..具体的使用时可以分层..就是老三层啦..

我这里是直接对象到数据库的操作的..

大家写的时候可以仔细弄一弄..

Mongodb的Samus驱动的更多相关文章

  1. 通过MongoDB的samus驱动实现基本数据操作

    一.MongoDB的驱动 MongoDB支持多种语言的驱动: 在此我们只介绍 C# 的驱动.仅C#驱动都有很多种,每种驱动的形式大致相同,但是细节各有千秋,因此代码不能通用.比较常用的是官方驱动和sa ...

  2. MongoDB C#samus驱动

    MongoDB的c#驱动有两种,官方驱动和samus驱动,不过我更喜欢samus驱动,因为samus驱动提供了丰富的linq操作. 官方驱动:https://github.com/mongodb/mo ...

  3. MongoDB学习笔记(二) 通过samus驱动实现基本数据操作

    传统的关系数据库一般由数据库(database).表(table).记录(record)三个层次概念组成,MongoDB是由(database).集合(collection).文档对象(documen ...

  4. MongoDb Samus 驱动的改进

    一直使用 MongoDb 的 Samus C#驱动. 其有一个缺陷,就是无法支持struct的读写. 但是一般数据都用Class包装,所以也没有太在意. 随着这些天尝试写入 KLineData 时,遇 ...

  5. 【转载】8天学通MongoDB——第八天 驱动实践

    作为系列的最后一篇,得要说说C#驱动对mongodb的操作,目前驱动有两种:官方驱动和samus驱动,不过我个人还是喜欢后者, 因为提供了丰富的linq操作,相当方便. 官方驱动:https://gi ...

  6. Samus驱动中的Document条件

    今天要说一个东西就是Samus驱动里的 Document  和他的一个子类 Op 在Samus驱动的增删改查方法中都有这类的参数传递.. 大致的使用方法是这样.. MongoU.Find<Per ...

  7. 8天学通MongoDB——第八天 驱动实践

    作为系列的最后一篇,得要说说C#驱动对mongodb的操作,目前驱动有两种:官方驱动和samus驱动,不过我个人还是喜欢后者, 因为提供了丰富的linq操作,相当方便. 官方驱动:https://gi ...

  8. 通过samus驱动实现基本数据操作

    传统的关系数据库一般由数据库(database).表(table).记录(record)三个层次概念组成,MongoDB是由(database).集合(collection).文档对象(documen ...

  9. [译] MongoDB Java异步驱动快速指南

    导读 mongodb-java-driver是mongodb的Java驱动项目. 本文是对MongoDB-java-driver官方文档 MongoDB Async Driver Quick Tour ...

随机推荐

  1. dede使用方法---如何调用指定栏目

    使用dede的时候,我们需要调用某一个指定的栏目,这个时候我们该如何使用标签呢?? 真相就是----{dede:type typeid='27'}*******{/dede:type} 完整的标签代码 ...

  2. 如何让ie 7 支持box-shadow

    box-shadow是一个很好用并且也常用的css 3属性,但是,如果我们要保证它能在ie 8及更低的版本下运行的话,需要借助一些其他的插件或文件.在这里我主要讲一下,如何用PIE.htc来解决ie ...

  3. C++11特性:auto关键字

    前言 本文的内容已经不新鲜了.关于auto,翻来覆去被人知道的都是这些东西,本文并没有提出新颖的auto用法. 本人原是痛恨博客一篇篇都是copy而来缺乏新意的探索,当然,本文不是copy而来,但发布 ...

  4. 图像卷积、相关以及在MATLAB中的操作

    图像卷积.相关以及在MATLAB中的操作 2016年7月11日 20:34:35, By ChrisZZ 区分卷积和相关 图像处理中常常需要用一个滤波器做空间滤波操作.空间滤波操作有时候也被叫做卷积滤 ...

  5. 【BZOJ-3709】Bohater 贪心

    3709: [PA2014]Bohater Time Limit: 5 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 835  Solved:  ...

  6. phpize报cannot find autoconf

    突然想往php种增加个模块,可是又不想重新编译php,因为真的比较费时间. phpize就可以解决这个问题. 遇到的问题: Configuring for: PHP Api Version: Zend ...

  7. BROOTKIT Pinciple、Code Analysis(undone)

    目录 . Rootkit相关知识 . BROOTKIT源码分析 . 关键技术点 . 防御策略 1. Rootkit相关知识 关于rootkit的相关其他知识,请参阅以下文章 http://www.cn ...

  8. hibernate-criteria查询

    Criteria查询是Hibernate提供的一种查询方式 下面就一个员工和部门来列一个总体的例子 package Test; import java.util.ArrayList; import j ...

  9. Enlisting multiple 1-phase aware participants in the same transaction

    In some cases it may be necessary to enlist participants that aren't two-phase commit aware into a t ...

  10. 高性能JavaScript笔记二(算法和流程控制、快速响应用户界面、Ajax)

    循环 在javaScript中的四种循环中(for.for-in.while.do-while),只有for-in循环比其它几种明显要慢,另外三种速度区别不大 有一点需要注意的是,javascript ...