.NET中全新的MongoDb ORM框架 - SqlSugar
<p>.NET中好用的MongoDb ORM很少,选择也很少,所以我打造了一款适合SQL习惯的MongoDb ORM,让用户多一个选择。</p><h2 data-first-child="">1、 MongoDB ORM教程</h2>
<h3>1.1 NUGET 安装</h3>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">SqlSugar.MongoDbCore
SqlSugarCore</span></pre>
</div>
<h3>1.2 已支持功能</h3>
<p data-pid="aNvk0oO9">单表CRUD+分页+排序+简单分组+嵌套文件(类似Json类型)+简单联表</p>
<h3>1.3 创建DB对象</h3>
<div class="highlight">
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">注册DLL防止找不到DLL(扔在程序启动时)</span>
InstanceFactory.CustomAssemblies = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> System.Reflection.Assembly[] {
</span><span style="color: rgba(0, 0, 255, 1)">typeof</span><span style="color: rgba(0, 0, 0, 1)">(SqlSugar.MongoDb.MongoDbProvider).Assembly };
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">db对象(用法和sqlsugar入门中一样)</span>
<span style="color: rgba(0, 0, 255, 1)">var</span> db = <span style="color: rgba(0, 0, 255, 1)">new</span> SqlSugarClient(<span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> ConnectionConfig()
{
IsAutoCloseConnection </span>= <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">,
DbType </span>=<span style="color: rgba(0, 0, 0, 1)"> DbType.MongoDb,
ConnectionString </span>=<span style="color: rgba(0, 0, 0, 1)"> SqlSugarConnectionString
},
it </span>=><span style="color: rgba(0, 0, 0, 1)">
{
it.Aop.OnLogExecuting </span>= (sql, para) =><span style="color: rgba(0, 0, 0, 1)">
{ </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">AOP打印SQL</span>
<span style="color: rgba(0, 0, 0, 1)"> Console.WriteLine(UtilMethods.GetNativeSql(sql, para));
};
});
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">字符串2种都可以</span>
<span style="color: rgba(0, 0, 255, 1)">var</span> ConnectionString = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">mongodb://root:123456@222.71.212.3:27017/testDB?authSource=admin</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">var</span>ConnectionString= <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">host=222.71.212.3;Port=27017;Database=testDB;Username= root;Password=123456;authSource=admin;replicaSet=</span><span style="color: rgba(128, 0, 0, 1)">"</span>;</pre>
</div>
<p> </p>
</div>
<h3>1.4 实体类定义(重点注意)</h3>
<p data-pid="rXMQkny2">主键定义:继承MongoDbBase里面自定义好了主键</p>
<p data-pid="uqJi5EXO">外键定义 :设置 ColumnDataType =nameof(ObjectId)</p>
<div class="highlight">
<div class="cnblogs_code">
<pre> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">继承的MongoDbBase里面已经有了主键,当然你也可以复制出来不用基类</span>
<span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Student:MongoDbBase
{
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">主键在基类,也可以自个复制出来不用基类</span>
<span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">string</span> Name { <span style="color: rgba(0, 0, 255, 1)">get</span>; <span style="color: rgba(0, 0, 255, 1)">set</span><span style="color: rgba(0, 0, 0, 1)">; }
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">外键需要设置ObjectId类型不然存储会的是string</span>
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">string</span> SchoolId { <span style="color: rgba(0, 0, 255, 1)">get</span>; <span style="color: rgba(0, 0, 255, 1)">set</span><span style="color: rgba(0, 0, 0, 1)">; }
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">MongoDbBase是ORM自带的一个类,方便你不定义主键</span>
<span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> MongoDbBase
{
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">string</span> Id { <span style="color: rgba(0, 0, 255, 1)">get</span>; <span style="color: rgba(0, 0, 255, 1)">set</span><span style="color: rgba(0, 0, 0, 1)">; }
}</span></pre>
</div>
</div>
<h2>2、CRUD用例</h2>
<h3>2.1 插入</h3>
<div class="highlight">
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">插入无返回值</span>
<span style="color: rgba(0, 0, 0, 1)">db.Insertable(data).ExecuteCommand();
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">插入并将主键赋值到实体</span>
<span style="color: rgba(0, 0, 0, 1)">db.Insertable(data).ExecuteCommandIdentityIntoEntity();
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">插入返回IDS</span>
<span style="color: rgba(0, 0, 255, 1)">var</span> ids= db.Insertable(data).ExecuteReturnPkList<<span style="color: rgba(0, 0, 255, 1)">string</span>>();</pre>
</div>
</div>
<h3>2.2 查询</h3>
<p data-pid="6LfAf-hl">MongoDb一般是单表操作比较多,官方并不推荐联表操作一般用json做嵌套文档比较多</p>
<p data-pid="3vE1DJx2">不过SqlSugar也支持了联表</p>
<div class="highlight">
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">简单查询</span>
<span style="color: rgba(0, 0, 255, 1)">var</span> data2 = db.Queryable<Student>().Where(it => it.Book.Price == <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">).ToList();
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">分页</span>
<span style="color: rgba(0, 0, 255, 1)">var</span> count = <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">var</span> list = db.Queryable<School>().OrderBy(it=>it.Name).ToPageList(<span style="color: rgba(128, 0, 128, 1)">1</span>,<span style="color: rgba(128, 0, 128, 1)">2</span>,<span style="color: rgba(0, 0, 255, 1)">ref</span><span style="color: rgba(0, 0, 0, 1)"> count);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">json类型(实体定义isjson)</span>
<span style="color: rgba(0, 0, 255, 1)">var</span> data2 = db.Queryable<Student>().Where(it => it.Book.Price == <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">).ToList();
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">简单联表(目前只能支持这种基本联表)</span>
<span style="color: rgba(0, 0, 255, 1)">var</span> list = db.Queryable<Student><span style="color: rgba(0, 0, 0, 1)">()
.LeftJoin</span><School>((x, y) => x.SchoolId ==<span style="color: rgba(0, 0, 0, 1)"> y.Id)
.LeftJoin</span><School>((x, y, z) => x.SchoolId ==<span style="color: rgba(0, 0, 0, 1)"> z.Id)
.Where((x, y) </span>=>y.Name == <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">TestSchool</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
.Select((x, y,z) </span>=> <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)">
{
StudentName </span>=<span style="color: rgba(0, 0, 0, 1)"> x.Name,
SchoolName </span>=<span style="color: rgba(0, 0, 0, 1)"> y.Name,
SchoolName2</span>=<span style="color: rgba(0, 0, 0, 1)">z.Name
}).ToList();
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">简单分组查询</span>
<span style="color: rgba(0, 0, 255, 1)">var</span> list14 = db.Queryable<OrderInfo><span style="color: rgba(0, 0, 0, 1)">()
.GroupBy(it </span>=> <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> { it.Name ,it.Price })
.Select(it </span>=> <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)">
{
key </span>=<span style="color: rgba(0, 0, 0, 1)"> it.Name,
Prie</span>=<span style="color: rgba(0, 0, 0, 1)">it.Price,
groupCount </span>=<span style="color: rgba(0, 0, 0, 1)"> SqlFunc.AggregateCount(it.Id),
max </span>=<span style="color: rgba(0, 0, 0, 1)"> SqlFunc.AggregateMax(it.Id),
min </span>=<span style="color: rgba(0, 0, 0, 1)"> SqlFunc.AggregateMin(it.Id)
}).ToList();
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">目前不支持导航查询和子查询</span></pre>
</div>
</div>
<h3>2.3 删除</h3>
<div class="highlight">
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">根据主键岀队string [] ids= [...]</span>
db.Deleteable<Student><span style="color: rgba(0, 0, 0, 1)">().In(ids).ExecuteCommandAsync()
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">根据实体删除,实体要有主键 var delrow = db.Deleteable(data).ExecuteCommand();</span></pre>
</div>
</div>
<h3>2.4 更新</h3>
<div class="highlight">
<div class="cnblogs_code">
<pre> <span style="color: rgba(0, 0, 255, 1)">var</span> updateRow2 = db.Updateable(<span style="color: rgba(0, 0, 255, 1)">new</span> List<OrderInfo><span style="color: rgba(0, 0, 0, 1)">()
{
</span><span style="color: rgba(0, 0, 255, 1)">new</span> OrderInfo() { Id = ids.First(),Name=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">a31</span><span style="color: rgba(128, 0, 0, 1)">"</span>,Price=<span style="color: rgba(128, 0, 128, 1)">11</span><span style="color: rgba(0, 0, 0, 1)">},
</span><span style="color: rgba(0, 0, 255, 1)">new</span> OrderInfo() { Id = ids.Last(),Name=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">a41</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">}
})
.ExecuteCommand();
</span><span style="color: rgba(0, 0, 255, 1)">var</span> updateRow3= db.Updateable<OrderInfo><span style="color: rgba(0, 0, 0, 1)">()
.SetColumns(it</span>=>it.Name==<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">xx</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
.Where(it</span>=> it.Id ==<span style="color: rgba(0, 0, 0, 1)"> id)
.ExecuteCommand();</span></pre>
</div>
</div>
<h3>2.5 使用原生SQL</h3>
<div class="highlight">
<div class="cnblogs_code">
<pre>db.Ado.ExecuteCommand(<span style="color: rgba(128, 0, 0, 1)">@"</span><span style="color: rgba(128, 0, 0, 1)">insertMany UnitSchool123131[{ ""Name"" : ""XX大学"" }]</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">C#对象构造</span>
<span style="color: rgba(0, 0, 255, 1)">var</span> documents = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)">[]
{
</span><span style="color: rgba(0, 0, 255, 1)">new</span> BsonDocument { { <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Name</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">XX大学</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> } }
};
</span><span style="color: rgba(0, 0, 255, 1)">var</span> bsonArray = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> BsonArray(documents).ToJson();
</span><span style="color: rgba(0, 0, 255, 1)">var</span> cmd = $<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">insertMany UnitSchool123131 {json}</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
db.Ado.ExecuteCommand(cmd);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">查询</span>
<span style="color: rgba(0, 0, 255, 1)">var</span> list=db.Ado.SqlQuery<T><span style="color: rgba(0, 0, 0, 1)">(cmd);
</span><span style="color: rgba(0, 0, 255, 1)">var</span> dt=<span style="color: rgba(0, 0, 0, 1)">db.Ado.GetDataTable(cmd);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">sqlsugar中获取原生对象</span>
IMongoDatabase rdb=<span style="color: rgba(0, 0, 0, 1)"> ((MongoDbConnection)db.Ado.Connection).GetDatabase();
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">IMongoDatabase 是什么东西?
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">var client = new MongoClient("mongodb:</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">localhost:27017");
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">IMongoDatabase database = client.GetDatabase("TestDatabase");</span></pre>
</div>
<p> </p>
</div>
<h2>3、源码DEM</h2>
<p>https://github.com/DotNetNext/SqlSugar </p>
<p><img src="https://img2024.cnblogs.com/blog/746906/202507/746906-20250701125746288-1798810326.png" alt="" loading="lazy"></p>
<p>DEMO 下载 : https://github.com/DotNetNext/SqlSugar </p>
<p> </p>
<p data-pid="J5khrjRy"> </p><br><br>
来源:https://www.cnblogs.com/sunkaixuan/p/18959484
頁:
[1]