潘群峰 發表於 2025-7-1 13:02:00

.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>=&gt;<span style="color: rgba(0, 0, 0, 1)">
{
      it.Aop.OnLogExecuting </span>= (sql, para) =&gt;<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>&nbsp;</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&lt;<span style="color: rgba(0, 0, 255, 1)">string</span>&gt;();</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&lt;Student&gt;().Where(it =&gt; 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&lt;School&gt;().OrderBy(it=&gt;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&lt;Student&gt;().Where(it =&gt; 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&lt;Student&gt;<span style="color: rgba(0, 0, 0, 1)">()
.LeftJoin</span>&lt;School&gt;((x, y) =&gt; x.SchoolId ==<span style="color: rgba(0, 0, 0, 1)"> y.Id)
.LeftJoin</span>&lt;School&gt;((x, y, z) =&gt; x.SchoolId ==<span style="color: rgba(0, 0, 0, 1)"> z.Id)
.Where((x, y) </span>=&gt;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>=&gt; <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&lt;OrderInfo&gt;<span style="color: rgba(0, 0, 0, 1)">()
   .GroupBy(it </span>=&gt; <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>=&gt; <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&lt;Student&gt;<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&lt;OrderInfo&gt;<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&lt;OrderInfo&gt;<span style="color: rgba(0, 0, 0, 1)">()
    .SetColumns(it</span>=&gt;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>=&gt; 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&lt;T&gt;<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>&nbsp;</p>
</div>
<h2>3、源码DEM</h2>
<p>https://github.com/DotNetNext/SqlSugar&nbsp;</p>
<p><img src="https://img2024.cnblogs.com/blog/746906/202507/746906-20250701125746288-1798810326.png" alt="" loading="lazy"></p>
<p>DEMO 下载 :&nbsp;https://github.com/DotNetNext/SqlSugar&nbsp;&nbsp;</p>
<p>&nbsp;</p>
<p data-pid="J5khrjRy">&nbsp;</p><br><br>
来源:https://www.cnblogs.com/sunkaixuan/p/18959484
頁: [1]
查看完整版本: .NET中全新的MongoDb ORM框架 - SqlSugar