最近开始学习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. jQuery打印插件jqprint

    码][JavaScript]代码     跳至 [1] [全屏预览] ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 ...

  2. MapReduce设置输出分隔符

    conf.set("mapred.textoutputformat.ignoreseparator","true"); conf.set("mapre ...

  3. Mvc action间的传值

    1, Mvc action间的传值? TempData["student"] ="123" 在<走入asp.net mvc不归路>系列文章5中,介绍 ...

  4. BZOJ4548 小奇的糖果

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...

  5. ListView优化-通用ViewHolder编写备份

    ViewHolder.java package cn.edu.bzu.util; import android.content.Context; import android.util.SparseA ...

  6. Qt出现cannot find -IGL错误

    Solution: sudo apt-get install build-essential sudo apt-get install libgl1-mesa-dev

  7. TypeScript 素描 - 泛型、枚举

    /* 泛型,好处多多的功能.不过这里最基本的就不打算说了,仅准备说一些 和C#不同的地方 */ /* 泛型接口 GenericIdentityFn 定义了方法的描述等 identity方法则是它的实现 ...

  8. CentOS设置防火墙开放端口

    1. iptables是linux下的防火墙,同时也是服务的名称. service iptables status service iptables start service iptables st ...

  9. As环境下添加android support library依赖库

    2015年的google大会上,google发布了新的Android Support Design库的新组件之一,以此来全面支持Material Design 设计风格的UI效果,为了可以使用这些新颖 ...

  10. FZU 2193 So Hard (有限小数转换最简分数)(想法题)

    题目链接: 传送门 So Hard Time Limit: 1000MS     Memory Limit: 65536K 题目描述 请将有限小数化为最简分数. 输入 一个整数n 表示需要转化的小数个 ...