这个MongoDB.Entities是一种访问MongoDB的ORM框架,写起来优雅,实在是太优雅了,和SqlSugar或者EF之类的框架一样可以使用linq。文档地址
首先在nuget安装MongoDB.Entities
项目启动的时候初始化
await DB.InitAsync(_mongoSetting.Database.Name, MongoClientSettings.FromConnectionString($"mongodb://{_mongoSetting.Database.UserName}:{_mongoSetting.Database.Password}@{_mongoSetting.Database.Address}/{_mongoSetting.Database.Name}"));
或者调这个
await DB.InitAsync("DatabaseName","127.0.0.1",27017);
然后实体类如下定义,需要注意的是MongoDB的时间是UTC,需要在getset方法做一个转换,不然差着8小时。
using MongoDB.Bson.Serialization.Attributes;
using MongoDB.Entities;
using System;
namespace MyApp.Entity
{
/// <summary>
/// 实体类
/// </summary>
[Collection("TestEntity")] //这里面就是集合名称,类似sql里面的表名
public class TestEntity : IEntity, ICreatedOn, IModifiedOn
{
/// <summary>
/// 主键GUID
/// </summary>
[BsonId]
public virtual string ID { get; set; }
/// <summary>
/// 创建时间
/// 写入时间为世界时间,需转换为本地时间
/// </summary>
private DateTime createdOn;
public virtual DateTime CreatedOn
{
get { return createdOn.ToLocalTime(); }
set { createdOn = value.ToUniversalTime(); }
}
/// <summary>
/// 更新时间
/// 写入时间为世界时间,需转换为本地时间
/// </summary>
private DateTime modifiedOn;
public virtual DateTime ModifiedOn
{
get { return modifiedOn.ToLocalTime(); }
set { modifiedOn = value.ToUniversalTime(); }
}
}
}
有了实体类以后只要调一下ORM的插入方法就会根据实体的属性生成MongoDB的表字段信息了,类似SqlSugar里面那种CodeFirst模式根据实体生成数据库表。
增删改如下,直接用linq操作,和EF或者Sqlsugar之类的ORM框架类似的
//增
await DB.SaveAsync(entity);
//直接传ID删除
await DB.DeleteAsync<TestEntity>(id);
//按条件删除
await DB.DeleteAsync<TestEntity>(c=>c.ID == id);
//修改整个实体
await DB.Update(entity).ExecuteAsync();
//修改指定字段
await DB.Update<TestEntity>()
.Match(c => c.ID == id)
.Modify(c => c.Name, "测试名称")
.Modify(c => c.Title, "测试标题")
.ExecuteAsync();
//查询指定数据
var entity = await DB.Find<TestEntity>()
.Match(c => c.ID == id)
.ExecuteFirstAsync();
分页查询如下
//分页查询数据
Expression<Func<TestEntity, bool>> tmpWhere = p => p.IsDeleted == false;//构造查询条件
var page = 1;
var rows = 10;
//分页数据列表
var tmpResult = await DB.Find<T>()
.Match(tmpWhere)
.Sort(p => p.CreatedOn, Order.Descending)//排序
.Skip((page - 1) * rows)
.Limit(rows)
.ExecuteAsync();
//符合条件的数据总数
var total = await DB.Queryable<T>()
.Where(tmpWhere)
.CountAsync();
另外查询时可以指定使用的索引,使用Option()
var tmpResult = await DB.Find<T>()
.Match(tmpWhere)
.Sort(p => p.CreatedOn, Order.Descending)//排序
.Option(o => o.Hint = hint)//指定索引,这里的hint就是索引名称
.Skip((page - 1) * rows)
.Limit(rows)
.ExecuteAsync();