小康粮油英子 發表於 2021-5-14 16:23:00

C#基于Mongo的官方驱动手撸一个简易版MongoDB-ORM框架

<p style="text-align: center"><span style="font-size: 14pt"><strong>C#基于Mongo的官方驱动手撸一个简易版MongoDB-ORM框架</strong></span></p>
<p><span style="font-size: 14pt">  <span style="font-size: 14px">如题,在GitHub上找了一圈想找一个MongoDB的的ORM框架,未偿所愿,就去翻了翻官网(https://docs.mongodb.com/drivers/csharp/)</span></span></p>
<p><span style="font-size: 14pt"><span style="font-size: 14px">看了看文档发现官方的驱动功能已经相当强大了并且更新速度很快 <br></span></span></p>
<p><span style="font-size: 14pt"><span style="font-size: 14px">  <img src="https://img2020.cnblogs.com/blog/1630815/202105/1630815-20210514140614602-2034933116.png" alt="" loading="lazy"></span></span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>    <span style="font-size: 14pt"><span style="font-size: 14px">2.3之后得驱动版本已经支持 .Net 5,而且方法都已支持Task ,可以配合async , await.使用 ,同时也支持Lambda表达式及表达式树 官方是这么说的(https://mongodb.github.io/mongo-csharp-driver/2.12/what_is_new/)</span></span></p>
<p>&nbsp;</p>
<p><span style="font-size: 14pt"><span style="font-size: 14px">  <img src="https://img2020.cnblogs.com/blog/1630815/202105/1630815-20210514142930221-1299507999.png" alt="" loading="lazy"></span></span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>    官方得驱动如此强大了,还找什么ORM框架,我们自己基于官方驱动手撸一个简易版的,首先简单讲一下设计思路</p>
<p>    <span style="color: rgba(0, 0, 255, 1)">要求1:首先要有一个对象实体基类,<span style="color: rgba(0, 0, 0, 1)">为什么要创建实体对象基类?是因为官方驱动支持的实体类与Collection得映射 必须要有id字段,对应数据库中得"_id",并且这个字段是ObjectIDl类型,像这样</span><br></span></p>
<div class="cnblogs_code">
<pre>    <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)"> Person
    {
      
      
      </span><span style="color: rgba(0, 0, 255, 1)">public</span> ObjectId 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>
<p><span style="color: rgba(0, 0, 0, 1)">所以创建实体基类是为了免去每个实体类都要创建这个id的冗余代码.</span></p>
<p><span style="color: rgba(0, 0, 255, 1)">    要求2:<span style="color: rgba(0, 0, 255, 1)">实现实体类与Collection得自动映射</span> 自动创建数据库连接.<span style="color: rgba(0, 0, 0, 1)">这一部分实现就稍微复杂一些,首先我们需要自定义一个Attribute,用于获取获取集合名称,然后创建一个管理器实现一些自动映射的初始化操作</span><br></span></p>
<p><span style="color: rgba(0, 0, 255, 1)"><span style="color: rgba(0, 0, 255, 1)">    要求3:实现Repository仓储类.提供简单得CRUD方法. <span style="color: rgba(0, 0, 0, 1)">这一部分就比较简单了,通过封装直接调用官方的驱动提供的API,实现CURD操作</span></span></span> </p>
<p><span style="color: rgba(0, 0, 255, 1)"><span style="color: rgba(0, 0, 255, 1)"><span style="color: rgba(0, 0, 0, 1)">    <span style="color: rgba(255, 153, 0, 1)">开始实现之前记得添加一下官方的驱动包直接在Nuget搜索MongoDB.Driver 安装就可以了 ,我这里使用的是2.12.3版本</span></span></span></span></p>
<p><strong><span style="color: rgba(0, 0, 0, 1); font-size: 14px">第一步:创建对象实体基类</span></strong></p>
<p>&nbsp;</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">   
   
    <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">当BSON文档被反序列化时,每个元素的名称用于在类映射中查找匹配的成员。通常,如果没有找到匹配的成员,将抛出异常。如果要在反序列化期间忽略其他元素 使用这个特性</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">abstract</span> <span style="color: rgba(0, 0, 255, 1)">class</span> MongoEntityBase : IMongoEntityBase&lt;<span style="color: rgba(0, 0, 255, 1)">string</span>&gt;<span style="color: rgba(0, 0, 0, 1)">
    {
      </span><span style="color: rgba(0, 0, 255, 1)">protected</span><span style="color: rgba(0, 0, 0, 1)"> MongoEntityBase()
      {
            DB_ID </span>= ObjectId.GenerateNewId().ToString();<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">对id进行初始化</span>
<span style="color: rgba(0, 0, 0, 1)">      }

      <br>     
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">因为 ObjectId 这个结构体是不能序列化的,所以使用 标记为这个字符串ID在mongo中代表ObjectId</span>
      <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">virtual</span> <span style="color: rgba(0, 0, 255, 1)">string</span> DB_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><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">interface</span> IMongoEntityBase&lt;TKey&gt;<span style="color: rgba(0, 0, 0, 1)">
    {
</span><span style="color: rgba(0, 0, 0, 1)">      
      TKey DB_ID { </span><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, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">interface</span> IMongoEntityBase : IMongoEntityBase&lt;<span style="color: rgba(0, 0, 255, 1)">string</span>&gt;<span style="color: rgba(0, 0, 0, 1)">
    {
    }</span></pre>
</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong><span style="color: rgba(0, 0, 0, 1); font-size: 14px">第二步:实现实体类与Collection的自动映射;<br></span></strong></p>
<p><strong><span style="color: rgba(0, 0, 0, 1); font-size: 14px">  </span></strong><span style="color: rgba(0, 0, 0, 1); font-size: 14px">我们需要先创建一个Attribute类,用于标记实体类来获取实体类对应的集合名称,如下:</span></p>
<p>&nbsp;</p>
<div class="cnblogs_code">
<pre>   
    </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)"> CollectionNameAttribute : Attribute
    {
      </span><span style="color: rgba(0, 0, 255, 1)">public</span> CollectionNameAttribute(<span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)"> name)

      {
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 0, 255, 1)">string</span>.IsNullOrEmpty(name)) <span style="color: rgba(0, 0, 255, 1)">throw</span> <span style="color: rgba(0, 0, 255, 1)">new</span> ArgumentException(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Empty collectionname not allowed</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)">name</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)">this</span>.Name =<span style="color: rgba(0, 0, 0, 1)"> name;
      }

      </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)">private</span> <span style="color: rgba(0, 0, 255, 1)">set</span>; } <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">定义一个属性 用于获取Collection名称</span>
    }</pre>
</div>
<p>&nbsp;</p>
<p>  接下来实现一个管理器,用于自动映射,数据库连接的自动映射,官方驱动其实已经提供了实体类的自动映射,我们只需要接着稍微封装一下,官方自动映射demo如下:</p>
<p>   <img src="https://img2020.cnblogs.com/blog/1630815/202105/1630815-20210514153056023-1703034695.png" alt="" loading="lazy"></p>
<p>&nbsp;</p>
<p>  有一部分准备工作要做,那就是需要在配置文件添加一个数据库连接的配置,用于连接数据库;</p>
<p>   <img src="https://img2020.cnblogs.com/blog/1630815/202105/1630815-20210514153259906-253111316.png" alt="" loading="lazy"></p>
<p>&nbsp;</p>
<p>  接下实现我们的管理器,这一部分是核心,实现了类与数据库Collection的自动映射,并自动创建出了mongo连接</p>
<div class="cnblogs_code">
<pre> <span style="color: rgba(0, 0, 255, 1)">internal</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">class</span> GlobleManage&lt;T&gt;<span style="color: rgba(0, 0, 0, 1)">
    {
      </span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)"> _tableName;
      </span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)"> _dateBaseName;
      </span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)"> _mongoServerSettings;
      </span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">static</span> IMongoCollection&lt;T&gt;<span style="color: rgba(0, 0, 0, 1)"> _mongoCollection;

      </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> IMongoCollection&lt;T&gt;<span style="color: rgba(0, 0, 0, 1)"> MongoCollection
      {
            </span><span style="color: rgba(0, 0, 255, 1)">get</span> =&gt;<span style="color: rgba(0, 0, 0, 1)"> _mongoCollection;

      }
      </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)"> DateBaseName
      {
            </span><span style="color: rgba(0, 0, 255, 1)">get</span> =&gt;<span style="color: rgba(0, 0, 0, 1)"> _dateBaseName;
      }

      </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)"> MongoServerSettings
      {
            </span><span style="color: rgba(0, 0, 255, 1)">get</span> =&gt;<span style="color: rgba(0, 0, 0, 1)"> _mongoServerSettings;
      }
      </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)"> TableName
      {
            </span><span style="color: rgba(0, 0, 255, 1)">get</span> =&gt;<span style="color: rgba(0, 0, 0, 1)"> _tableName;
      }

      </span><span style="color: rgba(0, 0, 255, 1)">static</span><span style="color: rgba(0, 0, 0, 1)"> GlobleManage()
      {
            Init();
      }

      </span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> Init()
      {
            </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)">string</span>[] parm = ConfigurationManager.ConnectionStrings[<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">MongoServerSettings</span><span style="color: rgba(128, 0, 0, 1)">"</span>].ConnectionString.Split(<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)">'</span><span style="color: rgba(0, 0, 0, 1)">);

            _dateBaseName </span>=<span style="color: rgba(0, 0, 0, 1)"> parm.Last();
            _mongoServerSettings </span>= ConfigurationManager.ConnectionStrings[<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">MongoServerSettings</span><span style="color: rgba(128, 0, 0, 1)">"</span>].ConnectionString.Replace(<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)">"</span> + _dateBaseName, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">:27017</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)">根据实体类标注好的Attribute获取表名</span>
            <span style="color: rgba(0, 0, 255, 1)">var</span> entitytype = <span style="color: rgba(0, 0, 255, 1)">typeof</span><span style="color: rgba(0, 0, 0, 1)">(T);
            </span><span style="color: rgba(0, 0, 255, 1)">var</span> attr = Attribute.GetCustomAttribute(entitytype, <span style="color: rgba(0, 0, 255, 1)">typeof</span><span style="color: rgba(0, 0, 0, 1)">(CollectionNameAttribute));
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">若Attribute不为空获取标注的表名</span>
            <span style="color: rgba(0, 0, 255, 1)">if</span> (attr != <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">)
            {
                _tableName </span>=<span style="color: rgba(0, 0, 0, 1)"> ((CollectionNameAttribute)attr).Name;

            }
            </span><span style="color: rgba(0, 0, 255, 1)">else</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)">否则如果类型是MongoEntityBase的派生类 获取类名作为表名</span>
                <span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 0, 255, 1)">typeof</span><span style="color: rgba(0, 0, 0, 1)">(MongoEntityBase).IsAssignableFrom(entitytype))
                {
                  </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> No attribute found, get the basetype</span>
                  <span style="color: rgba(0, 0, 255, 1)">while</span> (!entitytype.BaseType.Equals(<span style="color: rgba(0, 0, 255, 1)">typeof</span><span style="color: rgba(0, 0, 0, 1)">(MongoEntityBase)))
                  {
                        entitytype </span>=<span style="color: rgba(0, 0, 0, 1)"> entitytype.BaseType;
                  }
                }
                _tableName </span>=<span style="color: rgba(0, 0, 0, 1)"> entitytype.Name;
            }

            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">添加实体类映射</span>
            BsonClassMap.RegisterClassMap&lt;T&gt;(cm =&gt;<span style="color: rgba(0, 0, 0, 1)"> cm.AutoMap());

        
            _mongoCollection </span>= <span style="color: rgba(0, 0, 255, 1)">new</span> MongoClient(_mongoServerSettings).GetDatabase(_dateBaseName).GetCollection&lt;T&gt;<span style="color: rgba(0, 0, 0, 1)">(_tableName);
      }
    }</span></pre>
</div>
<p><strong><span style="color: rgba(0, 0, 0, 1); font-size: 14px">第三步:实现Repository仓储类.提供简单的CRUD方法</span></strong></p>
<p>&nbsp;  首先,先创建仓储类的泛型接口 </p>
<div class="cnblogs_code">
<pre>    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">interface</span> IRepository&lt;T&gt; <span style="color: rgba(0, 0, 255, 1)">where</span> T : IMongoEntityBase&lt;<span style="color: rgba(0, 0, 255, 1)">string</span>&gt;<span style="color: rgba(0, 0, 0, 1)">
    {
      IMongoCollection</span>&lt;T&gt; Collection { <span style="color: rgba(0, 0, 255, 1)">get</span><span style="color: rgba(0, 0, 0, 1)">; }

      </span><span style="color: rgba(0, 0, 255, 1)">bool</span><span style="color: rgba(0, 0, 0, 1)"> Add(T entity);
      </span><span style="color: rgba(0, 0, 255, 1)">bool</span> Delete(T delete, Expression&lt;Func&lt;T, <span style="color: rgba(0, 0, 255, 1)">bool</span>&gt;&gt; conditions = <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(0, 0, 255, 1)">bool</span> Update(T update, Expression&lt;Func&lt;T, <span style="color: rgba(0, 0, 255, 1)">bool</span>&gt;&gt; conditions = <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">);
      List</span>&lt;T&gt; Find(Expression&lt;Func&lt;T, <span style="color: rgba(0, 0, 255, 1)">bool</span>&gt;&gt; conditions = <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">);
    </span></pre>
</div>
<p>  泛型仓储类实现接口,通过管理器获取自动映射得到的 IMongoCollection</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span> Repository&lt;T&gt; : IRepository&lt;T&gt; <span style="color: rgba(0, 0, 255, 1)">where</span> T : IMongoEntityBase&lt;<span style="color: rgba(0, 0, 255, 1)">string</span>&gt;<span style="color: rgba(0, 0, 0, 1)">
    {

      </span><span style="color: rgba(0, 0, 255, 1)">private</span> IMongoCollection&lt;T&gt; _mongoCollection = GlobleManage&lt;T&gt;<span style="color: rgba(0, 0, 0, 1)">.MongoCollection;
      </span><span style="color: rgba(0, 0, 255, 1)">public</span> IMongoCollection&lt;T&gt; Collection =&gt;<span style="color: rgba(0, 0, 0, 1)"> _mongoCollection;

      </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">bool</span><span style="color: rgba(0, 0, 0, 1)"> Add(T entity)
      {
            </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)">
            {
                _mongoCollection.InsertOne(entity);
                </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">;
            }
            </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (Exception)
            {
                </span><span style="color: rgba(0, 0, 255, 1)">throw</span><span style="color: rgba(0, 0, 0, 1)">;
            }

      }
      </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">bool</span> Delete(T delete, Expression&lt;Func&lt;T, <span style="color: rgba(0, 0, 255, 1)">bool</span>&gt;&gt; conditions = <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">)
      {
            </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)">
            {
                </span><span style="color: rgba(0, 0, 255, 1)">string</span> _id = <span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">.Empty;
                </span><span style="color: rgba(0, 0, 255, 1)">if</span> (conditions == <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">)
                {
                  </span><span style="color: rgba(0, 0, 255, 1)">foreach</span> (<span style="color: rgba(0, 0, 255, 1)">var</span> item <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> delete.GetType().GetProperties())
                  {
                        </span><span style="color: rgba(0, 0, 255, 1)">if</span> (item.Name == <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">DB_ID</span><span style="color: rgba(128, 0, 0, 1)">"</span> &amp;&amp; item.GetValue(delete) != <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">)
                        {
                            _id </span>=<span style="color: rgba(0, 0, 0, 1)"> item.GetValue(delete).ToString();
                            </span><span style="color: rgba(0, 0, 255, 1)">var</span> result = _mongoCollection.DeleteOne(<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)">_id</span><span style="color: rgba(128, 0, 0, 1)">"</span>, BsonValue.Create(<span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> ObjectId(_id))));
                            </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> result.IsAcknowledged;
                        }
                  }
                }
                </span><span style="color: rgba(0, 0, 255, 1)">var</span> res =<span style="color: rgba(0, 0, 0, 1)"> _mongoCollection.DeleteOne(conditions);
                </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> res.IsAcknowledged;
            }
            </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (Exception)
            {
                </span><span style="color: rgba(0, 0, 255, 1)">throw</span><span style="color: rgba(0, 0, 0, 1)">;
            }
      }

      </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">bool</span> Update(T update, Expression&lt;Func&lt;T, <span style="color: rgba(0, 0, 255, 1)">bool</span>&gt;&gt; conditions = <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">)
      {
            </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)">
            {

                ObjectId _id;
                </span><span style="color: rgba(0, 0, 255, 1)">var</span> options = <span style="color: rgba(0, 0, 255, 1)">new</span> ReplaceOptions() { IsUpsert = <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)"> };
                </span><span style="color: rgba(0, 0, 255, 1)">if</span> (conditions == <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">)
                {
                  </span><span style="color: rgba(0, 0, 255, 1)">foreach</span> (<span style="color: rgba(0, 0, 255, 1)">var</span> item <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> update.GetType().GetProperties())
                  {
                        </span><span style="color: rgba(0, 0, 255, 1)">if</span> (item.Name == <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">DB_ID</span><span style="color: rgba(128, 0, 0, 1)">"</span> &amp;&amp; item.GetValue(update) != <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">)
                        {
                            _id </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> ObjectId(item.GetValue(update).ToString());
                            </span><span style="color: rgba(0, 0, 255, 1)">var</span> result = _mongoCollection.ReplaceOne(<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)">_id</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, BsonValue.Create(_id)), update, options);
                            </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> result.IsAcknowledged;
                        }
                  }
                }
                </span><span style="color: rgba(0, 0, 255, 1)">var</span> res =<span style="color: rgba(0, 0, 0, 1)"> _mongoCollection.ReplaceOne(conditions, update, options);
                </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> res.IsAcknowledged;
            }
            </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (Exception)
            {

                </span><span style="color: rgba(0, 0, 255, 1)">throw</span><span style="color: rgba(0, 0, 0, 1)">;
            }
      }

      </span><span style="color: rgba(0, 0, 255, 1)">public</span> List&lt;T&gt; Find(Expression&lt;Func&lt;T, <span style="color: rgba(0, 0, 255, 1)">bool</span>&gt;&gt; conditions = <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">)
      {
            </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)">
            {
                </span><span style="color: rgba(0, 0, 255, 1)">if</span> (conditions == <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">)
                {
                  conditions </span>= t =&gt; <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">;
                }

                </span><span style="color: rgba(0, 0, 255, 1)">return</span> _mongoCollection.Find(conditions).ToList() ?? <span style="color: rgba(0, 0, 255, 1)">new</span> List&lt;T&gt;<span style="color: rgba(0, 0, 0, 1)">();

            }
            </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (Exception)
            {
                </span><span style="color: rgba(0, 0, 255, 1)">throw</span><span style="color: rgba(0, 0, 0, 1)">;
            }
      }
    }</span></pre>
</div>
<p>&nbsp;</p>
<p>简易版的ORM框架就算是基本完成,接下来使用这个框架完成一些CRUD操作</p>
<p>首先,创建一个实体类,并且继承 MongoEntityBase</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">   
    </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)"> Person : MongoEntityBase
    {
      
      </span><span style="color: rgba(0, 0, 255, 1)">public</span> Person(<span style="color: rgba(0, 0, 255, 1)">string</span> name, <span style="color: rgba(0, 0, 255, 1)">int</span> age, <span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)"> guid, EnumGender gender)
      {

            Name </span>=<span style="color: rgba(0, 0, 0, 1)"> name;
            Age </span>=<span style="color: rgba(0, 0, 0, 1)"> age;
            Guid </span>=<span style="color: rgba(0, 0, 0, 1)"> guid;
            Gender </span>=<span style="color: rgba(0, 0, 0, 1)"> gender;
      }
      </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, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">int</span> Age { <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, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">string</span> Guid { <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, 0, 255, 1)">public</span> EnumGender Gender { <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, 0, 255, 1)">public</span> List&lt;Person&gt; Students { <span style="color: rgba(0, 0, 255, 1)">get</span> =&gt; students; <span style="color: rgba(0, 0, 255, 1)">set</span> =&gt; students =<span style="color: rgba(0, 0, 0, 1)"> value; }
      </span><span style="color: rgba(0, 0, 255, 1)">public</span> Pet Pet { <span style="color: rgba(0, 0, 255, 1)">get</span> =&gt; pet; <span style="color: rgba(0, 0, 255, 1)">set</span> =&gt; pet =<span style="color: rgba(0, 0, 0, 1)"> value; }

      </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> Pet pet;

      </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">override</span> <span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)"> ToString()
      {
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">DB_ID:</span><span style="color: rgba(128, 0, 0, 1)">"</span> + <span style="color: rgba(0, 0, 255, 1)">this</span>.DB_ID + <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)">"</span><span style="color: rgba(128, 0, 0, 1)">user:</span><span style="color: rgba(128, 0, 0, 1)">"</span> + Name + <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)">"</span><span style="color: rgba(128, 0, 0, 1)">age:</span><span style="color: rgba(128, 0, 0, 1)">"</span> + Age + <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)">"</span><span style="color: rgba(128, 0, 0, 1)">guid:</span><span style="color: rgba(128, 0, 0, 1)">"</span> + Guid + <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)">"</span><span style="color: rgba(128, 0, 0, 1)">Gender:</span><span style="color: rgba(128, 0, 0, 1)">"</span> + Gender.ToString() + <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)">"</span><span style="color: rgba(128, 0, 0, 1)">宠物叫</span><span style="color: rgba(128, 0, 0, 1)">"</span> + Pet.Name + <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)">"</span> + Pet.Age + <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)">"</span><span style="color: rgba(0, 0, 0, 1)">;
      }
      </span><span style="color: rgba(0, 0, 255, 1)">private</span> List&lt;Person&gt;<span style="color: rgba(0, 0, 0, 1)"> students;

    }
    </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">enum</span><span style="color: rgba(0, 0, 0, 1)"> EnumGender
    {
      男,
      女
    }

    </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)"> Pet
    {
      </span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)"> name;
      </span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> age;

      </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> =&gt; name; <span style="color: rgba(0, 0, 255, 1)">set</span> =&gt; name =<span style="color: rgba(0, 0, 0, 1)"> value; }
      </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">int</span> Age { <span style="color: rgba(0, 0, 255, 1)">get</span> =&gt; age; <span style="color: rgba(0, 0, 255, 1)">set</span> =&gt; age =<span style="color: rgba(0, 0, 0, 1)"> value; }
    }</span></pre>
</div>
<p>然后创建一个窗体 测试一下我们的CRUD功能,调用很简单 只需要一句&nbsp; <span style="color: rgba(255, 0, 0, 1)">IRepository&lt;Person&gt; _IRepository = new Repository&lt;Person&gt;();</span></p>
<div class="cnblogs_code">
<pre> <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">partial</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Form1 : Form
    {
      </span><span style="color: rgba(0, 0, 255, 1)">private</span> IRepository&lt;Person&gt; _IRepository = <span style="color: rgba(0, 0, 255, 1)">new</span> Repository&lt;Person&gt;<span style="color: rgba(0, 0, 0, 1)">();
      </span><span style="color: rgba(0, 0, 255, 1)">private</span> Random random = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Random();
      </span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> Form1()
      {
            InitializeComponent();
      }

      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">ADD</span>
      <span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">void</span> button1_Click(<span style="color: rgba(0, 0, 255, 1)">object</span><span style="color: rgba(0, 0, 0, 1)"> sender, EventArgs e)
      {
            Person person </span>= <span style="color: rgba(0, 0, 255, 1)">new</span> Person(<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)">"</span>, <span style="color: rgba(128, 0, 128, 1)">8</span><span style="color: rgba(0, 0, 0, 1)">, Guid.NewGuid().ToString(), EnumGender.男);
            person.Students </span>= <span style="color: rgba(0, 0, 255, 1)">new</span> List&lt;Person&gt;() { <span style="color: rgba(0, 0, 255, 1)">new</span> Person(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">张小三1</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 128, 1)">8</span><span style="color: rgba(0, 0, 0, 1)">, Guid.NewGuid().ToString(), EnumGender.男),
                </span><span style="color: rgba(0, 0, 255, 1)">new</span> Person(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">张小三2</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 128, 1)">8</span><span style="color: rgba(0, 0, 0, 1)">, Guid.NewGuid().ToString(), EnumGender.男)
                ,</span><span style="color: rgba(0, 0, 255, 1)">new</span> Person(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">张小三3</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 128, 1)">8</span><span style="color: rgba(0, 0, 0, 1)">, Guid.NewGuid().ToString(), EnumGender.男)
                ,</span><span style="color: rgba(0, 0, 255, 1)">new</span> Person(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">张小三4</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 128, 1)">8</span><span style="color: rgba(0, 0, 0, 1)">, Guid.NewGuid().ToString(), EnumGender.男)};
            person.Pet </span>= <span style="color: rgba(0, 0, 255, 1)">new</span> Pet() { Name = <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)">"</span>, Age = <span style="color: rgba(128, 0, 128, 1)">3</span><span style="color: rgba(0, 0, 0, 1)"> };
            _IRepository.Add(person);
            richTextBox1.Text </span>+= <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">添加成功!\r\n</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)">Find</span>
      <span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">void</span> button2_Click(<span style="color: rgba(0, 0, 255, 1)">object</span><span style="color: rgba(0, 0, 0, 1)"> sender, EventArgs e)
      {
            </span><span style="color: rgba(0, 0, 255, 1)">var</span> id =<span style="color: rgba(0, 0, 0, 1)"> textBox1.Text.Trim();
            </span><span style="color: rgba(0, 0, 255, 1)">var</span> list = _IRepository.Find(t =&gt;<span style="color: rgba(0, 0, 0, 1)"> t.DB_ID.Equals(id));
            richTextBox1.Text </span>+= <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Find成功:</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)">\r\n </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)">foreach</span> (<span style="color: rgba(0, 0, 255, 1)">var</span> item <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> list)
            {
                richTextBox1.Text </span>+= item.ToString() + <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">\r\n </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)">Delete</span>
      <span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">void</span> button3_Click(<span style="color: rgba(0, 0, 255, 1)">object</span><span style="color: rgba(0, 0, 0, 1)"> sender, EventArgs e)
      {
            </span><span style="color: rgba(0, 0, 255, 1)">var</span> id =<span style="color: rgba(0, 0, 0, 1)"> textBox1.Text.Trim();
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">var res = _IRepository.Delete(t =&gt; t.DB_ID.Equals(id));</span>
            <span style="color: rgba(0, 0, 255, 1)">var</span> rese = _IRepository.Find(t =&gt;<span style="color: rgba(0, 0, 0, 1)"> t.DB_ID.Equals(id)).FirstOrDefault();
            </span><span style="color: rgba(0, 0, 255, 1)">var</span> res =<span style="color: rgba(0, 0, 0, 1)"> _IRepository.Delete(rese);
            richTextBox1.Text </span>+= id + <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)">"</span> + res;<span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">res.IsAcknowledged + res.DeletedCount;</span><span style="color: rgba(0, 128, 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)">Update</span>
      <span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">void</span> button4_Click(<span style="color: rgba(0, 0, 255, 1)">object</span><span style="color: rgba(0, 0, 0, 1)"> sender, EventArgs e)
      {
            </span><span style="color: rgba(0, 0, 255, 1)">var</span> guid =<span style="color: rgba(0, 0, 0, 1)"> textBox1.Text.Trim();
            Person person </span>= _IRepository.Find(t =&gt;<span style="color: rgba(0, 0, 0, 1)"> t.DB_ID.Equals(guid)).FirstOrDefault();
            person.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)">"</span> + random.Next(<span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">10</span><span style="color: rgba(0, 0, 0, 1)">);</span><span style="color: rgba(0, 0, 0, 1)">
            var res </span>=<span style="color: rgba(0, 0, 0, 1)"> _IRepository.Update(person);
            richTextBox1.Text </span>+= guid + <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)">"</span> +<span style="color: rgba(0, 0, 0, 1)"> res;

      }
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">Clear</span>
      <span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">void</span> button5_Click(<span style="color: rgba(0, 0, 255, 1)">object</span><span style="color: rgba(0, 0, 0, 1)"> sender, EventArgs e)
      {
            textBox1.Clear();
            richTextBox1.Clear();
      }

      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">FindAll</span>
      <span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">void</span> button6_Click(<span style="color: rgba(0, 0, 255, 1)">object</span><span style="color: rgba(0, 0, 0, 1)"> sender, EventArgs e)
      {
            </span><span style="color: rgba(0, 0, 255, 1)">var</span> list =<span style="color: rgba(0, 0, 0, 1)"> _IRepository.Find();
            richTextBox1.Text </span>+= <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">FindAll成功:</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)">\r\n </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)">foreach</span> (<span style="color: rgba(0, 0, 255, 1)">var</span> item <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> list)
            {
                richTextBox1.Text </span>+= item.ToString() + <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">\r\n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
            }
      }
    }</span></pre>
</div>
<p>&nbsp;</p>
<p><img src="https://img2020.cnblogs.com/blog/1630815/202105/1630815-20210514160319703-1086403340.png" alt="" loading="lazy"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;简易版本的功能基本都实现,实际上,一个成熟的ORM框架还有好多工作要做</p>
<p>&nbsp;</p>
<p>源码链接:https://pan.baidu.com/s/1dE2UgR4EXyIPQNmR0Q6Efw <br>提取码:s9k5 <br><br></p>
<p>以上代码为本人原创,如有错误之处,望大家不吝赐教,感谢(抱拳~)</p>
<p>&nbsp;</p>
<div id="mttContainer" class="bootstrapiso notranslate" style="transform: translate(10px, 656px)" title="" data-original-title="">&nbsp;</div>

</div>
<div id="MySignature" role="contentinfo">
    <div style="border: solid 1px; padding: 10px; background: #EECFA1 url(&quot;https://images.cnblogs.com/cnblogs_com/grenet/226272/o_o_o_info.png&quot;) no-repeat scroll 15px 50%; padding-left: 80px">
    <p>

            作者:
            Niuery Daily
    </p>
    <p>
            出处:
            https://www.cnblogs.com/pandefu/&gt;
    </p>
<p>邮箱:
defu_pan@163.com

</p>
    <p>
            关于作者:.Net Framework,.Net Core ,WindowsForm,WPF ,控件库,多线程
    </p>
<p>
             本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出
             原文链接,否则保留追究法律责任的权利。
             如有问题, 可邮件咨询。
    </p>
</div><br><br>
来源:https://www.cnblogs.com/pandefu/p/14769022.html
頁: [1]
查看完整版本: C#基于Mongo的官方驱动手撸一个简易版MongoDB-ORM框架