生铁刘老五 發表於 2015-7-17 15:08:00

本人为巨杉数据库(开源NoSQL)写的C#驱动,支持Linq,全部开源,已提交github

<h1>一、关于NoSQL的项目需求</h1>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 这些年在做AgileEAS.NET SOA 中间件平台的推广、技术咨询服务过程之中,特别是针对我们最熟悉的医疗行业应用之中,针对大数据分析,大并发性能的需求,我们也在慢慢的引用NoSQL技术来满足数据分析与性能等多方面的需要,也进一步完善我们的SOA基石架构风格:</p>
<p><img style="background-image: none; float: none; padding-top: 0; padding-left: 0; margin-left: auto; display: block; padding-right: 0; margin-right: auto; border-width: 0" title="image_thumb" src="//images0.cnblogs.com/blog/19020/201312/19185617-bcc609396d824a838ea93e7e665bbb7f.png" alt="image_thumb" width="953" height="434" border="0"></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 在早些年,对NoSQL不是很了解这前,后端数据存储都是存储的单一的关系数据库之上,但是在很多时间,这并不是最优的,比如在医疗用户之中针对一个病人的相关数据展示,及相关性分析,关于数据库就不是最优的,另外一个,电子病历系统的之中的结构化/半结构化病历文档的存储、检索,以及更高级的应用,结构化病历数据挖掘,之前使用关系数据库存储或者使用文件存储,很难发挥病历数据的科研和统计、分析需求。</p>
<p>&nbsp;&nbsp;&nbsp; 在目前我们的医疗信息化应用之中,我们针对这两部分数据都引入了NoSQL存储,针对住院患者的领域相关性数据==》即病人聚合根对象相关数据,我们即在关系数据库以多表存储病人数据以及病人相关的医嘱、费用、检验、检查、护理等相关信息,同时我们也在NoSQL数据库存储患者的聚合根对象:</p>
<p><img style="display: inline" title="0NO5MFOQW74SFJC`@6R(@_3" src="https://images0.cnblogs.com/blog/19020/201507/171458163765653.png" alt="0NO5MFOQW74SFJC`@6R(@_3" width="1003" height="612"></p>
<p>&nbsp;&nbsp;&nbsp; 在NoSQL数据库之中的存储:</p>
<p><img style="background-image: none; padding-top: 0; padding-left: 0; display: inline; padding-right: 0; border-width: 0" title="~NHW)0EH_0OC$KA7~8LYITU" src="https://images0.cnblogs.com/blog/19020/201507/171458182357351.jpg" alt="~NHW)0EH_0OC$KA7~8LYITU" width="825" height="587" border="0"></p>
<p>&nbsp;&nbsp;&nbsp; 另外在电子病历应用之中,病历文档也是直接存入NoSQL之中。</p>
<p>&nbsp;&nbsp;&nbsp; 在接触巨杉数据库之前,我们一直使用MongoDB这款NoSQL产品,这是一款广为人知的NoSQL产品,使用者众多,C#的驱动也非常完善,案例也比比皆时。</p>
<h1>三、关于巨杉(sequoiadb)数据库</h1>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 巨杉数据库是国人开发的一款企业级NoSQL数据库,目前已开源,官网http://www.sequoiadb.com/。 <br>初次了解到巨杉(sequoiadb)数据还是源于一个客户,因为我们项目一直使用MongoDB,客户就向我们提到巨杉(sequoiadb)数据库,说国内有人开发了这么一个NoSQL数据库,并且在平安银行有过成功应用,并且因为是国人开发,所以应该相比较MongoDB,应该能得到官方的支持,客户也和巨杉(sequoiadb)官方的人有过接触,官方也答应可以做一些支持。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 根据网上所公开的一些信息,巨杉(sequoiadb)数据库和MongoDB非常的接近,都是文档型数据库,同样的设计思路,集合和文档,同样的文档格式,Json/Bson。    <br>根据最近一段时间的了解和完善C#驱动的过程来说,相对MongoDB,巨杉(sequoiadb)提供了更加方便的图形化部署和简单的Web管理界面:</p>
<p><img style="background-image: none; padding-top: 0; padding-left: 0; display: inline; padding-right: 0; border-width: 0" title="image" src="https://images0.cnblogs.com/blog/19020/201507/171458212514064.png" alt="image" width="1028" height="582" border="0"></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 以下是SequoiaDB与MongoDB及其他NoSQL数据的功能对比:</p>
<p><img style="float: none; margin-left: auto; display: block; margin-right: auto" src="http://attach.dataguru.cn/attachments/forum/201411/02/1312478nsptnjnezn7dvnv.png" alt="" width="600" height="292"></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 比较特别是的SequoiaDB支持事务和SQL语法,当然了,这两点在目前情况下我们都使用使用过。</p>
<h1>四、关于SequoiaDB的C#驱动</h1>
<p>&nbsp;&nbsp;&nbsp;&nbsp; SequoiaDB官方提供C、C++、JAVA、C#、php、Python驱动以及REST架构风格的接口,据官方的说法是Java的驱动很成熟,但是C#的驱动很简单,只能支持最基本的Bson格式的接口,如下代码:</p>
<div class="cnblogs_code" style="background-color: rgba(245, 245, 245, 1); border: 1px solid rgba(204, 204, 204, 1); padding: 5px">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Insert</span>
            BsonDocument insertor = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> BsonDocument();
            insertor.Add(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Last 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)">Lin</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
            insertor.Add(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">First 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)">Hetiu</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
            insertor.Add(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Address</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)">SYSU</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
            BsonDocument sInsertor </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> BsonDocument();
            sInsertor.Add(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Phone</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)">10086</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
            sInsertor.Add(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">EMail</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)">hetiu@yahoo.com.cn</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
            insertor.Add(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Contact</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, sInsertor);
            ObjectId insertID </span>=<span style="color: rgba(0, 0, 0, 1)"> (ObjectId)coll.Insert(insertor);
            Assert.IsNotNull(insertID);

            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Update</span>
            DBQuery query = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> DBQuery();
            BsonDocument updater </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> BsonDocument();
            BsonDocument matcher </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> BsonDocument();
            BsonDocument modifier </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> BsonDocument();
            updater.Add(</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>, <span style="color: rgba(128, 0, 128, 1)">25</span><span style="color: rgba(0, 0, 0, 1)">);
            modifier.Add(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">$set</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, updater);
            matcher.Add(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">First 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)">Hetiu</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
            query.Matcher </span>=<span style="color: rgba(0, 0, 0, 1)"> matcher;
            query.Modifier </span>=<span style="color: rgba(0, 0, 0, 1)"> modifier;
            coll.Update(query);

            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Query</span>
            DBCursor cursor =<span style="color: rgba(0, 0, 0, 1)"> coll.Query(query);
            Assert.IsNotNull(cursor);
            BsonDocument bson </span>=<span style="color: rgba(0, 0, 0, 1)"> cursor.Next();
            Assert.IsNotNull(bson);
            Assert.IsTrue(bson[</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">First Name</span><span style="color: rgba(128, 0, 0, 1)">"</span>].AsString.Equals(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Hetiu</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">));
            Assert.IsTrue(bson[</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>].AsInt32.Equals(<span style="color: rgba(128, 0, 128, 1)">25</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>
            BsonDocument drop = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> BsonDocument();
            drop.Add(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Last 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)">Lin</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
            coll.Delete(drop);
            query.Matcher </span>=<span style="color: rgba(0, 0, 0, 1)"> drop;
            cursor </span>=<span style="color: rgba(0, 0, 0, 1)"> coll.Query(query);
            Assert.IsNotNull(cursor);
            bson </span>=<span style="color: rgba(0, 0, 0, 1)"> cursor.Next();
            Assert.IsNull(bson);</span></pre>
</div>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 集合查询:</p>
<div class="cnblogs_code" style="background-color: rgba(245, 245, 245, 1); border: 1px solid rgba(204, 204, 204, 1); padding: 5px">
<pre><span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">int</span> i = <span style="color: rgba(128, 0, 128, 1)">0</span>; i &lt; <span style="color: rgba(128, 0, 128, 1)">10</span>; ++<span style="color: rgba(0, 0, 0, 1)">i)
            {
                </span><span style="color: rgba(0, 0, 255, 1)">string</span> date =<span style="color: rgba(0, 0, 0, 1)"> DateTime.Now.ToString();
                BsonDocument insertor </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> BsonDocument();
                insertor.Add(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">operation</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)">Query</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
                insertor.Add(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">date</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, date);
                coll.Insert(insertor);
            }
            BsonDocument matcher </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> BsonDocument();
            DBQuery query </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> DBQuery();
            matcher.Add(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">operation</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)">Query</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
            query.Matcher </span>=<span style="color: rgba(0, 0, 0, 1)"> matcher;
            query.ReturnRowsCount </span>= <span style="color: rgba(128, 0, 128, 1)">5</span><span style="color: rgba(0, 0, 0, 1)">;
            query.SkipRowsCount </span>= <span style="color: rgba(128, 0, 128, 1)">5</span><span style="color: rgba(0, 0, 0, 1)">;
            DBCursor cursor </span>=<span style="color: rgba(0, 0, 0, 1)"> coll.Query(query);
            Assert.IsNotNull(cursor);
            </span><span style="color: rgba(0, 0, 255, 1)">int</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)">while</span> (cursor.Next() != <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, 0, 1)">count;
                BsonDocument bson </span>=<span style="color: rgba(0, 0, 0, 1)"> cursor.Current();
                Assert.IsNotNull(bson);
            }
            Assert.IsTrue(count </span>== <span style="color: rgba(128, 0, 128, 1)">5</span>);</pre>
</div>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 官方的代码有点简单,这不符合我们写代码的风格,目前业务系统大量的使用对象操作和Linq处理,原始的Bson接口,这个不科学。</p>
<h1>五、完善改造SequoiaDB的C#驱动</h1>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 即然官方的驱动太简单,不支持对象处理,也不支持Linq,很不科学,那么应该怎么办呢,其实第一个观点当然是放弃,我们原本使用MongoDB跑的好好的,为什么要给自己找事呢,但是出于项目运维的观点,以及支持国人产品的想法,最终决定自己完善和写一个。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 那么如何来写呢,当然是他山之石,可以攻玉,因为之前做MongoDB开发,原始的驱动配置我们的ORM跑起来也有一些问题,最早我们使用的非MongoDB的官方驱动,而是第三方驱动samus,不支持Decimal类型,但是我们项目之中有大量的Decimal类型,那么办呢,修改驱动,后来我们又换成了MongoDB的官方驱动,因为XmlIgnore标签和Id映射的问题也认真的读过MongoDB的官方驱动,对MongoDB的C#驱动比较熟悉。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 所以完善SequoiaDB的C#的思路就变成了结合SequoiaDB的原始驱动和MongoDB的官方驱动,提供一个类似于MongoDB驱动的操作风格的驱动,在SequoiaDB驱动的基础上提供了,直接操作C#对象的方案和支持Linq进行查询、修改、删除的功能。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 经本人完善修改之后的驱动的操作风格如下:</p>
<div class="cnblogs_code" style="background-color: rgba(245, 245, 245, 1); border: 1px solid rgba(204, 204, 204, 1); padding: 5px">
<pre>Sequoiadb sdb = <span style="color: rgba(0, 0, 255, 1)">new</span> Sequoiadb(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">192.168.23.57:50000</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
            sdb.Connect(</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, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">求集合空间。</span>
            <span style="color: rgba(0, 0, 255, 1)">var</span> cs = sdb.GetCollecitonSpace(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">dbo</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)">求集合。</span>
            <span style="color: rgba(0, 0, 255, 1)">var</span> coll = cs.GetCollection&lt;HFareDetail&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)">执行数据插入。</span>
            List&lt;HFareDetail&gt; vList =<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)">using</span> (AgileHIS.Entities.DbEntities db = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> AgileHIS.Entities.DbEntities())
            {
                vList </span>=<span style="color: rgba(0, 0, 0, 1)"> db.HFareDetails.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)">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)"> vList)
                {
                  coll.Insert(item);
                }
                System.Console.WriteLine(</span><span style="color: rgba(0, 0, 255, 1)">string</span>.Format(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">insert {0} records</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, vList.Count));
                System.Console.ReadLine();
            }

            </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> v1 =<span style="color: rgba(0, 0, 0, 1)"> vList.FirstOrDefault();
            v1.Name </span>= <span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">.Empty;
            v1.Cash </span>= <span style="color: rgba(0, 0, 255, 1)">decimal</span><span style="color: rgba(0, 0, 0, 1)">.Zero;
            coll.Update(v1, p </span>=&gt; p.ID ==<span style="color: rgba(0, 0, 0, 1)"> v1.ID);
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">按条件指量修改,指定某几个必,其他属性全部置空。</span>
            coll.Update(p =&gt; <span style="color: rgba(0, 0, 255, 1)">new</span> HFareDetail { Cash = <span style="color: rgba(0, 0, 255, 1)">decimal</span>.Zero, Name = <span style="color: rgba(0, 0, 255, 1)">string</span>.Empty, Price = <span style="color: rgba(0, 0, 255, 1)">decimal</span>.Zero }, p =&gt; p.ChargeTime &gt;DateTime.Now.AddDays(-<span style="color: rgba(128, 0, 128, 1)">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)">依据条件删除</span>
            coll.Delete(p =&gt; p.ChargeTime &gt; DateTime.Now.AddDays(-<span style="color: rgba(128, 0, 128, 1)">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)">求Count</span>
            <span style="color: rgba(0, 0, 255, 1)">int</span> count = coll.AsQueryable&lt;HFareDetail&gt;<span style="color: rgba(0, 0, 0, 1)">()
                .Where(p </span>=&gt; p.SourceID==<span style="color: rgba(128, 0, 128, 1)">0</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)">Linq查询Take\Skip。</span>
            <span style="color: rgba(0, 0, 255, 1)">var</span> vList2 = coll.AsQueryable&lt;HFareDetail&gt;<span style="color: rgba(0, 0, 0, 1)">()
                .Where(p </span>=&gt; p.CreateTime &gt; DateTime.Now.Date.AddMonths(-<span style="color: rgba(128, 0, 128, 1)">12</span><span style="color: rgba(0, 0, 0, 1)">))
                .Skip(</span><span style="color: rgba(128, 0, 128, 1)">10</span>).Take(<span style="color: rgba(128, 0, 128, 1)">1000</span><span style="color: rgba(0, 0, 0, 1)">)
                .ToList();
            System.Console.WriteLine(</span><span style="color: rgba(0, 0, 255, 1)">string</span>.Format(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">query {0} records</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, vList.Count));

            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">Linq查询过。</span>
            <span style="color: rgba(0, 0, 255, 1)">var</span> vFare = coll.AsQueryable&lt;HFareDetail&gt;<span style="color: rgba(0, 0, 0, 1)">()
                .Where(p </span>=&gt; p.CreateTime &gt; DateTime.Now.Date.AddMonths(-<span style="color: rgba(128, 0, 128, 1)">12</span><span style="color: rgba(0, 0, 0, 1)">))
                .FirstOrDefault();
            System.Console.WriteLine(vFare);

            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">Linq\聚合运算,目前因为测试驱动报错,暂未实现</span>
            <span style="color: rgba(0, 0, 255, 1)">var</span> sum = coll.AsQueryable&lt;HFareDetail&gt;<span style="color: rgba(0, 0, 0, 1)">()
                .Where(p </span>=&gt; p.CreateTime &gt; DateTime.Now.Date.AddMonths(-<span style="color: rgba(128, 0, 128, 1)">12</span><span style="color: rgba(0, 0, 0, 1)">))
                .Sum(p </span>=&gt;<span style="color: rgba(0, 0, 0, 1)"> p.Cash);

            System.Console.ReadLine();</span></pre>
</div>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 看看,代码是不是很清爽,很方便了呢,没有了bson,只有对象,Linq。</p>
<h1>六、SequoiaDB、MongoDB与AgileEAS.NET SOA整合</h1>
<p>&nbsp;&nbsp;&nbsp;&nbsp; AgileEAS.NET SOA之前只支持MongoDB,最近要支持SequoiaDB,我们就得考虑对原有代码的兼容,或者说,更希望自己的医疗系统能够在业务上同时支持MongoDB和SequoiaDB,达到使用环境之中不管是选择MongoDB还是选择SequoiaDB都是同样的代码,为此,我们在AgileEAS.NET SOA中间件之中定义了一个IStructDbProvider接口:</p>
<div class="cnblogs_code" style="background-color: rgba(245, 245, 245, 1); border: 1px solid rgba(204, 204, 204, 1); padding: 5px">
<pre><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Collections.Generic;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Linq.Expressions;

</span><span style="color: rgba(0, 0, 255, 1)">namespace</span><span style="color: rgba(0, 0, 0, 1)"> EAS.Data
{
    </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
    <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 结构化数据库提供者接口定义。
    </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
    <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;remarks&gt;</span>
    <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 为AgileEAS.NET SOA 中间件NoSQL数据访问提供标准接口定义。
    </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/remarks&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">interface</span><span style="color: rgba(0, 0, 0, 1)"> IStructDbProvider
    {
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 打开连接。
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> Connect();

      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 关闭连接。
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> Close();

      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 连接是否打开。
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">bool</span> IsOpen { <span style="color: rgba(0, 0, 255, 1)">get</span><span style="color: rgba(0, 0, 0, 1)">; }

      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 对象插入。
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;typeparam name="T"&gt;</span><span style="color: rgba(0, 128, 0, 1)">对象类型。</span><span style="color: rgba(128, 128, 128, 1)">&lt;/typeparam&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="item"&gt;</span><span style="color: rgba(0, 128, 0, 1)">对象实例。</span><span style="color: rgba(128, 128, 128, 1)">&lt;/param&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">void</span> Insert&lt;T&gt;(T item) <span style="color: rgba(0, 0, 255, 1)">where</span> T : <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)">;

      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 对象批量插入。
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;typeparam name="T"&gt;</span><span style="color: rgba(0, 128, 0, 1)">对象类型。</span><span style="color: rgba(128, 128, 128, 1)">&lt;/typeparam&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="items"&gt;</span><span style="color: rgba(0, 128, 0, 1)">对象实例。</span><span style="color: rgba(128, 128, 128, 1)">&lt;/param&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">void</span> InsertBatch&lt;T&gt;(System.Collections.Generic.IEnumerable&lt;T&gt; items) <span style="color: rgba(0, 0, 255, 1)">where</span> T : <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)">;

      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 根据条件执行更新操作。
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;typeparam name="T"&gt;</span><span style="color: rgba(0, 128, 0, 1)">对象类型。</span><span style="color: rgba(128, 128, 128, 1)">&lt;/typeparam&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="updater"&gt;</span><span style="color: rgba(0, 128, 0, 1)">更新表达式。</span><span style="color: rgba(128, 128, 128, 1)">&lt;/param&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="func"&gt;</span><span style="color: rgba(0, 128, 0, 1)">查询条件。</span><span style="color: rgba(128, 128, 128, 1)">&lt;/param&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">void</span> Update&lt;T&gt;(Expression&lt;Func&lt;T, T&gt;&gt; updater, Expression&lt;Func&lt;T, <span style="color: rgba(0, 0, 255, 1)">bool</span>&gt;&gt; func) <span style="color: rgba(0, 0, 255, 1)">where</span> T : <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)">;

      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 根据条件执行更新操作。
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;typeparam name="T"&gt;</span><span style="color: rgba(0, 128, 0, 1)">对象类型。</span><span style="color: rgba(128, 128, 128, 1)">&lt;/typeparam&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="item"&gt;</span><span style="color: rgba(0, 128, 0, 1)">更新对象。</span><span style="color: rgba(128, 128, 128, 1)">&lt;/param&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="func"&gt;</span><span style="color: rgba(0, 128, 0, 1)">查询条件。</span><span style="color: rgba(128, 128, 128, 1)">&lt;/param&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">void</span> Update&lt;T&gt;(T item, System.Linq.Expressions.Expression&lt;Func&lt;T, <span style="color: rgba(0, 0, 255, 1)">bool</span>&gt;&gt; func) <span style="color: rgba(0, 0, 255, 1)">where</span> T : <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)">;

      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 根据条件删除对象。
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;typeparam name="T"&gt;</span><span style="color: rgba(0, 128, 0, 1)">对象类型。</span><span style="color: rgba(128, 128, 128, 1)">&lt;/typeparam&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="func"&gt;</span><span style="color: rgba(0, 128, 0, 1)">条件表达式。</span><span style="color: rgba(128, 128, 128, 1)">&lt;/param&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">void</span> Delete&lt;T&gt;(Expression&lt;Func&lt;T, <span style="color: rgba(0, 0, 255, 1)">bool</span>&gt;&gt; func) <span style="color: rgba(0, 0, 255, 1)">where</span> T : <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)">;
      
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 求出Linq查询表达式。
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;typeparam name="T"&gt;</span><span style="color: rgba(0, 128, 0, 1)">对象类型。</span><span style="color: rgba(128, 128, 128, 1)">&lt;/typeparam&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;returns&gt;</span><span style="color: rgba(0, 128, 0, 1)">对象表达式包装。</span><span style="color: rgba(128, 128, 128, 1)">&lt;/returns&gt;</span>
      IQueryableWarp&lt;T&gt; Linq&lt;T&gt;() <span style="color: rgba(0, 0, 255, 1)">where</span> T : <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)">;

      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 根据条件查询数制。
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;typeparam name="T"&gt;</span><span style="color: rgba(0, 128, 0, 1)">对象类型。</span><span style="color: rgba(128, 128, 128, 1)">&lt;/typeparam&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="where"&gt;</span><span style="color: rgba(0, 128, 0, 1)">条件。</span><span style="color: rgba(128, 128, 128, 1)">&lt;/param&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="skip"&gt;</span><span style="color: rgba(0, 128, 0, 1)">跳过记录数。</span><span style="color: rgba(128, 128, 128, 1)">&lt;/param&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="take"&gt;</span><span style="color: rgba(0, 128, 0, 1)">取记录数。</span><span style="color: rgba(128, 128, 128, 1)">&lt;/param&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;returns&gt;</span><span style="color: rgba(0, 128, 0, 1)">查询结构。</span><span style="color: rgba(128, 128, 128, 1)">&lt;/returns&gt;</span>
      List&lt;T&gt; List&lt;T&gt;(Expression&lt;Func&lt;T, <span style="color: rgba(0, 0, 255, 1)">bool</span>&gt;&gt; <span style="color: rgba(0, 0, 255, 1)">where</span>, <span style="color: rgba(0, 0, 255, 1)">int</span> skip, <span style="color: rgba(0, 0, 255, 1)">int</span> take) <span style="color: rgba(0, 0, 255, 1)">where</span> T : <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)">;

      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 根据条件求单条记录。
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;typeparam name="T"&gt;</span><span style="color: rgba(0, 128, 0, 1)">对象类型。</span><span style="color: rgba(128, 128, 128, 1)">&lt;/typeparam&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="where"&gt;</span><span style="color: rgba(0, 128, 0, 1)">条件。</span><span style="color: rgba(128, 128, 128, 1)">&lt;/param&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;returns&gt;</span><span style="color: rgba(0, 128, 0, 1)">对象实例。</span><span style="color: rgba(128, 128, 128, 1)">&lt;/returns&gt;</span>
      T Single&lt;T&gt;(Expression&lt;Func&lt;T, <span style="color: rgba(0, 0, 255, 1)">bool</span>&gt;&gt; <span style="color: rgba(0, 0, 255, 1)">where</span>) <span style="color: rgba(0, 0, 255, 1)">where</span> T : <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)">;
    }
}</span></pre>
</div>
<p>&nbsp;&nbsp;&nbsp;&nbsp; IStructDbProvider字面意思即为结构化数据访问提供者接口,本接口定义在EAS.MicroKernel.dll程序集之中,AgileEAS.NET SOA中间件同时提供了针对SequoiaDB和MongoDB数据库的IStructDbProvider实现,EAS.Data.MongoDbProvider和EAS.Data.SequoiaDbProvider,这两个实现类定义在EAS.Data.NoSQL.dll程序集之中。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 因为统计使用了IStructDbProvider接口,我们针对SequoiaDB和MongoDB的操作处理就统计成了如下代码:</p>
<div class="cnblogs_code" style="background-color: rgba(245, 245, 245, 1); border: 1px solid rgba(204, 204, 204, 1); padding: 5px">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> vContainer =<span style="color: rgba(0, 0, 0, 1)"> EAS.Context.ContextHelper.GetContext().Container;
            </span><span style="color: rgba(0, 0, 255, 1)">var</span> dbProvider = vContainer.GetComponentInstance(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">StructDbProvider</span><span style="color: rgba(128, 0, 0, 1)">"</span>) <span style="color: rgba(0, 0, 255, 1)">as</span><span style="color: rgba(0, 0, 0, 1)"> IStructDbProvider;

            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">执行数据插入。</span>
            List&lt;HFareDetail&gt; vList = <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)">using</span> (AgileHIS.Entities.DbEntities db = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> AgileHIS.Entities.DbEntities())
            {
                vList </span>=<span style="color: rgba(0, 0, 0, 1)"> db.HFareDetails.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)">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)"> vList)
                {
                  dbProvider.Insert</span>&lt;HFareDetail&gt;<span style="color: rgba(0, 0, 0, 1)">(item);
                }
                System.Console.WriteLine(</span><span style="color: rgba(0, 0, 255, 1)">string</span>.Format(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">insert {0} records</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, vList.Count));
                System.Console.ReadLine();
            }

            </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> v1 =<span style="color: rgba(0, 0, 0, 1)"> vList.FirstOrDefault();
            v1.Name </span>= <span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">.Empty;
            v1.Cash </span>= <span style="color: rgba(0, 0, 255, 1)">decimal</span><span style="color: rgba(0, 0, 0, 1)">.Zero;
            dbProvider.Update</span>&lt;HFareDetail&gt;(v1, p =&gt; p.ID ==<span style="color: rgba(0, 0, 0, 1)"> v1.ID);
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">按条件指量修改,指定某几个必,其他属性全部置空。</span>
            dbProvider.Update&lt;HFareDetail&gt;(p =&gt; <span style="color: rgba(0, 0, 255, 1)">new</span> HFareDetail { Cash = <span style="color: rgba(0, 0, 255, 1)">decimal</span>.Zero, Name = <span style="color: rgba(0, 0, 255, 1)">string</span>.Empty, Price = <span style="color: rgba(0, 0, 255, 1)">decimal</span>.Zero }, p =&gt; p.ChargeTime &gt; DateTime.Now.AddDays(-<span style="color: rgba(128, 0, 128, 1)">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)">依据条件删除</span>
            dbProvider.Delete&lt;HFareDetail&gt;(p =&gt; p.ChargeTime &gt; DateTime.Now.AddDays(-<span style="color: rgba(128, 0, 128, 1)">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)">求Count</span>
            <span style="color: rgba(0, 0, 255, 1)">using</span> (<span style="color: rgba(0, 0, 255, 1)">var</span> queryWarp = dbProvider.Linq&lt;HFareDetail&gt;<span style="color: rgba(0, 0, 0, 1)">())
            {
                </span><span style="color: rgba(0, 0, 255, 1)">int</span> count =<span style="color: rgba(0, 0, 0, 1)"> queryWarp.Queryable
                .Where(p </span>=&gt; p.SourceID == <span style="color: rgba(128, 0, 128, 1)">0</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)">Linq查询Take\Skip。</span>
                <span style="color: rgba(0, 0, 255, 1)">var</span> vList2 =<span style="color: rgba(0, 0, 0, 1)"> queryWarp.Queryable
                  .Where(p </span>=&gt; p.CreateTime &gt; DateTime.Now.Date.AddMonths(-<span style="color: rgba(128, 0, 128, 1)">12</span><span style="color: rgba(0, 0, 0, 1)">))
                  .Skip(</span><span style="color: rgba(128, 0, 128, 1)">10</span>).Take(<span style="color: rgba(128, 0, 128, 1)">1000</span><span style="color: rgba(0, 0, 0, 1)">)
                  .ToList();
                System.Console.WriteLine(</span><span style="color: rgba(0, 0, 255, 1)">string</span>.Format(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">query {0} records</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, vList.Count));

                </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">Linq查询过。</span>
                <span style="color: rgba(0, 0, 255, 1)">var</span> vFare =<span style="color: rgba(0, 0, 0, 1)"> queryWarp.Queryable
                  .Where(p </span>=&gt; p.CreateTime &gt; DateTime.Now.Date.AddMonths(-<span style="color: rgba(128, 0, 128, 1)">12</span><span style="color: rgba(0, 0, 0, 1)">))
                  .FirstOrDefault();
                System.Console.WriteLine(vFare);

                </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">Linq\聚合运算,目前因为测试驱动报错,暂未实现</span>
                <span style="color: rgba(0, 0, 255, 1)">var</span> sum =<span style="color: rgba(0, 0, 0, 1)"> queryWarp.Queryable
                  .Where(p </span>=&gt; p.CreateTime &gt; DateTime.Now.Date.AddMonths(-<span style="color: rgba(128, 0, 128, 1)">12</span><span style="color: rgba(0, 0, 0, 1)">))
                  .Sum(p </span>=&gt;<span style="color: rgba(0, 0, 0, 1)"> p.Cash);
            }

            System.Console.ReadLine();</span></pre>
</div>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 具体是使用SequoiaDB还是使用MongoDB由系统配置文件来决定,使用SequoiaDB:</p>
<div class="cnblogs_code" style="background-color: rgba(245, 245, 245, 1); border: 1px solid rgba(204, 204, 204, 1); padding: 5px">
<pre><span style="color: rgba(0, 128, 0, 1)">&lt;!--</span><span style="color: rgba(0, 128, 0, 1)">StructDb/SequoiaDb</span><span style="color: rgba(0, 128, 0, 1)">--&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">object </span><span style="color: rgba(255, 0, 0, 1)">name</span><span style="color: rgba(0, 0, 255, 1)">="StructDbProvider"</span><span style="color: rgba(255, 0, 0, 1)"> assembly</span><span style="color: rgba(0, 0, 255, 1)">="EAS.Data.NoSQL"</span><span style="color: rgba(255, 0, 0, 1)"> type</span><span style="color: rgba(0, 0, 255, 1)">="EAS.Data.SequoiaDbProvider"</span><span style="color: rgba(255, 0, 0, 1)"> LifestyleType</span><span style="color: rgba(0, 0, 255, 1)">="Thread"</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">property </span><span style="color: rgba(255, 0, 0, 1)">name</span><span style="color: rgba(0, 0, 255, 1)">="ConnectionString"</span><span style="color: rgba(255, 0, 0, 1)"> type</span><span style="color: rgba(0, 0, 255, 1)">="string"</span><span style="color: rgba(255, 0, 0, 1)"> value</span><span style="color: rgba(0, 0, 255, 1)">="192.168.23.57:50000"</span><span style="color: rgba(0, 0, 255, 1)">/&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">property </span><span style="color: rgba(255, 0, 0, 1)">name</span><span style="color: rgba(0, 0, 255, 1)">="UserName"</span><span style="color: rgba(255, 0, 0, 1)"> type</span><span style="color: rgba(0, 0, 255, 1)">="string"</span><span style="color: rgba(255, 0, 0, 1)"> value</span><span style="color: rgba(0, 0, 255, 1)">=""</span><span style="color: rgba(0, 0, 255, 1)">/&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">property </span><span style="color: rgba(255, 0, 0, 1)">name</span><span style="color: rgba(0, 0, 255, 1)">="Password"</span><span style="color: rgba(255, 0, 0, 1)"> type</span><span style="color: rgba(0, 0, 255, 1)">="string"</span><span style="color: rgba(255, 0, 0, 1)"> value</span><span style="color: rgba(0, 0, 255, 1)">=""</span><span style="color: rgba(0, 0, 255, 1)">/&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">property </span><span style="color: rgba(255, 0, 0, 1)">name</span><span style="color: rgba(0, 0, 255, 1)">="CollectionSpace"</span><span style="color: rgba(255, 0, 0, 1)"> type</span><span style="color: rgba(0, 0, 255, 1)">="string"</span><span style="color: rgba(255, 0, 0, 1)"> value</span><span style="color: rgba(0, 0, 255, 1)">="his"</span><span style="color: rgba(0, 0, 255, 1)">/&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">object</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span></pre>
</div>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 使用MongoDB。</p>
<div class="cnblogs_code" style="background-color: rgba(245, 245, 245, 1); border: 1px solid rgba(204, 204, 204, 1); padding: 5px">
<pre><span style="color: rgba(0, 128, 0, 1)">&lt;!--</span><span style="color: rgba(0, 128, 0, 1)">StructDb/MongoDb</span><span style="color: rgba(0, 128, 0, 1)">--&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">object </span><span style="color: rgba(255, 0, 0, 1)">name</span><span style="color: rgba(0, 0, 255, 1)">="StructDbProvider"</span><span style="color: rgba(255, 0, 0, 1)"> assembly</span><span style="color: rgba(0, 0, 255, 1)">="EAS.Data.NoSQL"</span><span style="color: rgba(255, 0, 0, 1)"> type</span><span style="color: rgba(0, 0, 255, 1)">="EAS.Data.MongoDbProvider"</span><span style="color: rgba(255, 0, 0, 1)"> LifestyleType</span><span style="color: rgba(0, 0, 255, 1)">="Thread"</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">property </span><span style="color: rgba(255, 0, 0, 1)">name</span><span style="color: rgba(0, 0, 255, 1)">="ConnectionString"</span><span style="color: rgba(255, 0, 0, 1)"> type</span><span style="color: rgba(0, 0, 255, 1)">="string"</span><span style="color: rgba(255, 0, 0, 1)"> value</span><span style="color: rgba(0, 0, 255, 1)">="mongodb://sa:sa@127.0.0.1:2222/his"</span><span style="color: rgba(0, 0, 255, 1)">/&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">property </span><span style="color: rgba(255, 0, 0, 1)">name</span><span style="color: rgba(0, 0, 255, 1)">="DbName"</span><span style="color: rgba(255, 0, 0, 1)"> type</span><span style="color: rgba(0, 0, 255, 1)">="string"</span><span style="color: rgba(255, 0, 0, 1)"> value</span><span style="color: rgba(0, 0, 255, 1)">="his"</span><span style="color: rgba(0, 0, 255, 1)">/&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">object</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span></pre>
</div>
<h1>七、SequoiaDB的C#驱动源代码托管、下载</h1>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 本人为SequoiaDB所写的C#驱动,已提交托管到github,项目地址https://github.com/agilelab/SequoiaDB.Charp,欢迎大家下载,也欢迎大家和本人一道完善本驱动。</p>
<h1>八、联系我们</h1>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 敏捷软件工程实验室,是一家研究、推广和发展新技术,并致力于提供具有自主知识产权的业务基础平台软件,以及基于业务基础平台开发的管理软件的专业软件提供商。主要业务是为客户提供软件企业研发管理解决方案、企业管理软件开发,以及相关的技术支持,管理及技术咨询与培训业务。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; AgileEAS.NET SOA中间件平台自2004年秋呱呱落地一来,我就一直在逐步完善和改进,也被应用于保险、医疗、电子商务、房地产、铁路、教育等多个应用,但一直都是以我个人在推广,2010年因为我辞职休息,我就想到把AgileEAS.NET推向市场,让更多的人使用。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 我的技术团队成员都是合作多年的老朋友,因为这个平台是免费的,所以也没有什么收入,都是由程序员的那种理想与信念坚持,在此我感谢一起奋斗的朋友。</p>
<p>团队网站:http://www.agilelab.cn</p>
<p>AgileEAS.NET网站:http://www.agileeas.net</p>
<p>官方博客:http://eastjade.cnblogs.com</p>
<p>github:https://github.com/agilelab/eas</p>
<p>QQ:47920381,AgileEAS.NET</p>
<p>QQ群:113723486(AgileEAS SOA 平台)/上限1000人</p>
<p>199463175(AgileEAS SOA 交流)/上限1000人</p>
<p>212867943(AgileEAS.NET研究)/上限500人</p>
<p>147168308(AgileEAS.NET应用)/上限500人</p>
<p>172060626(深度AgileEAS.NET平台)/上限500人</p>
<p>116773358(AgileEAS.NET 平台)/上限500人</p>
<p>125643764(AgileEAS.NET探讨)/上限500人</p>
<p>193486983(AgileEAS.NET 平台)/上限500人</p>
<p>邮件:james@agilelab.cn,mail.james@qq.com,</p>
<p>电话:18629261335。</p>

</div>
<div id="MySignature" role="contentinfo">
    <span style="font-size: 10pt;">
</span><div>
<div>
<p style='background: url("http://pic.cnblogs.com/face/u19020.jpg") no-repeat 1% 50%; padding: 10px 10px 10px 60px; border: 1px dashed rgb(224, 224, 224); font-family: 微软雅黑; font-size: 12px;' id="PSignature"><br /><span style="font-size: 10pt;">作者:</span><strong><span style="color: red; font-size: 12px;"><font color="#3d81ee"><span style="font-size: 10pt;">魏琼东</span></font></span></strong> <br /><span style="font-size: 10pt;">出处:</span><span style="font-size: 10pt;">http://www.cnblogs.com/eastjade</span><br /><span style="font-size: 10pt;">关于作者:有13年的软件从业经历,专注于中小软件企业软件开发过程研究,通过在技术与管理帮助中小软件企业实现技术层面开源节流的目的。熟悉需求分析、企业架构、项目管理。现主要从事基于</span><span style="font-size: 10pt;">AgileEAS.NET</span><span style="font-size: 10pt;">平台的技术咨询工作,主要服务于医疗卫生、铁路、电信、物流、物联网、制造、零售等行业。如有问题或建议,请多多赐教! </span><br /><span style="font-size: 10pt;">本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,如有问题,可以通过</span><span style="font-size: 10pt;">mail.james@qq.com</span><span style="font-size: 10pt;"> 联系我,也可以加入QQ群:113723486、199463175、116773358、116773358、212867943、147168308、59827496、193486983、15118502和大家共同讨论,非常</span><span style="font-size: 12pt;">感谢。</span></p></div></div><br><br>
来源:https://www.cnblogs.com/eastjade/p/4654515.html
頁: [1]
查看完整版本: 本人为巨杉数据库(开源NoSQL)写的C#驱动,支持Linq,全部开源,已提交github