本人为巨杉数据库(开源NoSQL)写的C#驱动,支持Linq,全部开源,已提交github
<h1>一、关于NoSQL的项目需求</h1><p> 这些年在做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> 在早些年,对NoSQL不是很了解这前,后端数据存储都是存储的单一的关系数据库之上,但是在很多时间,这并不是最优的,比如在医疗用户之中针对一个病人的相关数据展示,及相关性分析,关于数据库就不是最优的,另外一个,电子病历系统的之中的结构化/半结构化病历文档的存储、检索,以及更高级的应用,结构化病历数据挖掘,之前使用关系数据库存储或者使用文件存储,很难发挥病历数据的科研和统计、分析需求。</p>
<p> 在目前我们的医疗信息化应用之中,我们针对这两部分数据都引入了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> 在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> 另外在电子病历应用之中,病历文档也是直接存入NoSQL之中。</p>
<p> 在接触巨杉数据库之前,我们一直使用MongoDB这款NoSQL产品,这是一款广为人知的NoSQL产品,使用者众多,C#的驱动也非常完善,案例也比比皆时。</p>
<h1>三、关于巨杉(sequoiadb)数据库</h1>
<p> 巨杉数据库是国人开发的一款企业级NoSQL数据库,目前已开源,官网http://www.sequoiadb.com/。 <br>初次了解到巨杉(sequoiadb)数据还是源于一个客户,因为我们项目一直使用MongoDB,客户就向我们提到巨杉(sequoiadb)数据库,说国内有人开发了这么一个NoSQL数据库,并且在平安银行有过成功应用,并且因为是国人开发,所以应该相比较MongoDB,应该能得到官方的支持,客户也和巨杉(sequoiadb)官方的人有过接触,官方也答应可以做一些支持。</p>
<p> 根据网上所公开的一些信息,巨杉(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> 以下是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> 比较特别是的SequoiaDB支持事务和SQL语法,当然了,这两点在目前情况下我们都使用使用过。</p>
<h1>四、关于SequoiaDB的C#驱动</h1>
<p> 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> 集合查询:</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 < <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> 官方的代码有点简单,这不符合我们写代码的风格,目前业务系统大量的使用对象操作和Linq处理,原始的Bson接口,这个不科学。</p>
<h1>五、完善改造SequoiaDB的C#驱动</h1>
<p> 即然官方的驱动太简单,不支持对象处理,也不支持Linq,很不科学,那么应该怎么办呢,其实第一个观点当然是放弃,我们原本使用MongoDB跑的好好的,为什么要给自己找事呢,但是出于项目运维的观点,以及支持国人产品的想法,最终决定自己完善和写一个。</p>
<p> 那么如何来写呢,当然是他山之石,可以攻玉,因为之前做MongoDB开发,原始的驱动配置我们的ORM跑起来也有一些问题,最早我们使用的非MongoDB的官方驱动,而是第三方驱动samus,不支持Decimal类型,但是我们项目之中有大量的Decimal类型,那么办呢,修改驱动,后来我们又换成了MongoDB的官方驱动,因为XmlIgnore标签和Id映射的问题也认真的读过MongoDB的官方驱动,对MongoDB的C#驱动比较熟悉。</p>
<p> 所以完善SequoiaDB的C#的思路就变成了结合SequoiaDB的原始驱动和MongoDB的官方驱动,提供一个类似于MongoDB驱动的操作风格的驱动,在SequoiaDB驱动的基础上提供了,直接操作C#对象的方案和支持Linq进行查询、修改、删除的功能。</p>
<p> 经本人完善修改之后的驱动的操作风格如下:</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<HFareDetail><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<HFareDetail> 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>=> 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 => <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 => p.ChargeTime >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 => p.ChargeTime > 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<HFareDetail><span style="color: rgba(0, 0, 0, 1)">()
.Where(p </span>=> 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<HFareDetail><span style="color: rgba(0, 0, 0, 1)">()
.Where(p </span>=> p.CreateTime > 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<HFareDetail><span style="color: rgba(0, 0, 0, 1)">()
.Where(p </span>=> p.CreateTime > 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<HFareDetail><span style="color: rgba(0, 0, 0, 1)">()
.Where(p </span>=> p.CreateTime > 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>=><span style="color: rgba(0, 0, 0, 1)"> p.Cash);
System.Console.ReadLine();</span></pre>
</div>
<p> 看看,代码是不是很清爽,很方便了呢,没有了bson,只有对象,Linq。</p>
<h1>六、SequoiaDB、MongoDB与AgileEAS.NET SOA整合</h1>
<p> 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)"><summary></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)"></summary></span>
<span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><remarks></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)"></remarks></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)"><summary></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)"></summary></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)"><summary></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)"></summary></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)"><summary></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)"></summary></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)"><summary></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)"></summary></span>
<span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><typeparam name="T"></span><span style="color: rgba(0, 128, 0, 1)">对象类型。</span><span style="color: rgba(128, 128, 128, 1)"></typeparam></span>
<span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><param name="item"></span><span style="color: rgba(0, 128, 0, 1)">对象实例。</span><span style="color: rgba(128, 128, 128, 1)"></param></span>
<span style="color: rgba(0, 0, 255, 1)">void</span> Insert<T>(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)"><summary></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)"></summary></span>
<span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><typeparam name="T"></span><span style="color: rgba(0, 128, 0, 1)">对象类型。</span><span style="color: rgba(128, 128, 128, 1)"></typeparam></span>
<span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><param name="items"></span><span style="color: rgba(0, 128, 0, 1)">对象实例。</span><span style="color: rgba(128, 128, 128, 1)"></param></span>
<span style="color: rgba(0, 0, 255, 1)">void</span> InsertBatch<T>(System.Collections.Generic.IEnumerable<T> 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)"><summary></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)"></summary></span>
<span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><typeparam name="T"></span><span style="color: rgba(0, 128, 0, 1)">对象类型。</span><span style="color: rgba(128, 128, 128, 1)"></typeparam></span>
<span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><param name="updater"></span><span style="color: rgba(0, 128, 0, 1)">更新表达式。</span><span style="color: rgba(128, 128, 128, 1)"></param></span>
<span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><param name="func"></span><span style="color: rgba(0, 128, 0, 1)">查询条件。</span><span style="color: rgba(128, 128, 128, 1)"></param></span>
<span style="color: rgba(0, 0, 255, 1)">void</span> Update<T>(Expression<Func<T, T>> updater, Expression<Func<T, <span style="color: rgba(0, 0, 255, 1)">bool</span>>> 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)"><summary></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)"></summary></span>
<span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><typeparam name="T"></span><span style="color: rgba(0, 128, 0, 1)">对象类型。</span><span style="color: rgba(128, 128, 128, 1)"></typeparam></span>
<span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><param name="item"></span><span style="color: rgba(0, 128, 0, 1)">更新对象。</span><span style="color: rgba(128, 128, 128, 1)"></param></span>
<span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><param name="func"></span><span style="color: rgba(0, 128, 0, 1)">查询条件。</span><span style="color: rgba(128, 128, 128, 1)"></param></span>
<span style="color: rgba(0, 0, 255, 1)">void</span> Update<T>(T item, System.Linq.Expressions.Expression<Func<T, <span style="color: rgba(0, 0, 255, 1)">bool</span>>> 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)"><summary></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)"></summary></span>
<span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><typeparam name="T"></span><span style="color: rgba(0, 128, 0, 1)">对象类型。</span><span style="color: rgba(128, 128, 128, 1)"></typeparam></span>
<span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><param name="func"></span><span style="color: rgba(0, 128, 0, 1)">条件表达式。</span><span style="color: rgba(128, 128, 128, 1)"></param></span>
<span style="color: rgba(0, 0, 255, 1)">void</span> Delete<T>(Expression<Func<T, <span style="color: rgba(0, 0, 255, 1)">bool</span>>> 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)"><summary></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)"></summary></span>
<span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><typeparam name="T"></span><span style="color: rgba(0, 128, 0, 1)">对象类型。</span><span style="color: rgba(128, 128, 128, 1)"></typeparam></span>
<span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><returns></span><span style="color: rgba(0, 128, 0, 1)">对象表达式包装。</span><span style="color: rgba(128, 128, 128, 1)"></returns></span>
IQueryableWarp<T> Linq<T>() <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)"><summary></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)"></summary></span>
<span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><typeparam name="T"></span><span style="color: rgba(0, 128, 0, 1)">对象类型。</span><span style="color: rgba(128, 128, 128, 1)"></typeparam></span>
<span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><param name="where"></span><span style="color: rgba(0, 128, 0, 1)">条件。</span><span style="color: rgba(128, 128, 128, 1)"></param></span>
<span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><param name="skip"></span><span style="color: rgba(0, 128, 0, 1)">跳过记录数。</span><span style="color: rgba(128, 128, 128, 1)"></param></span>
<span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><param name="take"></span><span style="color: rgba(0, 128, 0, 1)">取记录数。</span><span style="color: rgba(128, 128, 128, 1)"></param></span>
<span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><returns></span><span style="color: rgba(0, 128, 0, 1)">查询结构。</span><span style="color: rgba(128, 128, 128, 1)"></returns></span>
List<T> List<T>(Expression<Func<T, <span style="color: rgba(0, 0, 255, 1)">bool</span>>> <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)"><summary></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)"></summary></span>
<span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><typeparam name="T"></span><span style="color: rgba(0, 128, 0, 1)">对象类型。</span><span style="color: rgba(128, 128, 128, 1)"></typeparam></span>
<span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><param name="where"></span><span style="color: rgba(0, 128, 0, 1)">条件。</span><span style="color: rgba(128, 128, 128, 1)"></param></span>
<span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><returns></span><span style="color: rgba(0, 128, 0, 1)">对象实例。</span><span style="color: rgba(128, 128, 128, 1)"></returns></span>
T Single<T>(Expression<Func<T, <span style="color: rgba(0, 0, 255, 1)">bool</span>>> <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> IStructDbProvider字面意思即为结构化数据访问提供者接口,本接口定义在EAS.MicroKernel.dll程序集之中,AgileEAS.NET SOA中间件同时提供了针对SequoiaDB和MongoDB数据库的IStructDbProvider实现,EAS.Data.MongoDbProvider和EAS.Data.SequoiaDbProvider,这两个实现类定义在EAS.Data.NoSQL.dll程序集之中。</p>
<p> 因为统计使用了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<HFareDetail> 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><HFareDetail><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><HFareDetail>(v1, p => 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<HFareDetail>(p => <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 => p.ChargeTime > 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<HFareDetail>(p => p.ChargeTime > 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<HFareDetail><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>=> 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>=> p.CreateTime > 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>=> p.CreateTime > 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>=> p.CreateTime > 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>=><span style="color: rgba(0, 0, 0, 1)"> p.Cash);
}
System.Console.ReadLine();</span></pre>
</div>
<p> 具体是使用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)"><!--</span><span style="color: rgba(0, 128, 0, 1)">StructDb/SequoiaDb</span><span style="color: rgba(0, 128, 0, 1)">--></span>
<span style="color: rgba(0, 0, 255, 1)"><</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)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</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)">/></span>
<span style="color: rgba(0, 0, 255, 1)"><</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)">/></span>
<span style="color: rgba(0, 0, 255, 1)"><</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)">/></span>
<span style="color: rgba(0, 0, 255, 1)"><</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)">/></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">object</span><span style="color: rgba(0, 0, 255, 1)">></span></pre>
</div>
<p> 使用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)"><!--</span><span style="color: rgba(0, 128, 0, 1)">StructDb/MongoDb</span><span style="color: rgba(0, 128, 0, 1)">--></span>
<span style="color: rgba(0, 0, 255, 1)"><</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)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</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)">/></span>
<span style="color: rgba(0, 0, 255, 1)"><</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)">/></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">object</span><span style="color: rgba(0, 0, 255, 1)">></span></pre>
</div>
<h1>七、SequoiaDB的C#驱动源代码托管、下载</h1>
<p> 本人为SequoiaDB所写的C#驱动,已提交托管到github,项目地址https://github.com/agilelab/SequoiaDB.Charp,欢迎大家下载,也欢迎大家和本人一道完善本驱动。</p>
<h1>八、联系我们</h1>
<p> 敏捷软件工程实验室,是一家研究、推广和发展新技术,并致力于提供具有自主知识产权的业务基础平台软件,以及基于业务基础平台开发的管理软件的专业软件提供商。主要业务是为客户提供软件企业研发管理解决方案、企业管理软件开发,以及相关的技术支持,管理及技术咨询与培训业务。</p>
<p> AgileEAS.NET SOA中间件平台自2004年秋呱呱落地一来,我就一直在逐步完善和改进,也被应用于保险、医疗、电子商务、房地产、铁路、教育等多个应用,但一直都是以我个人在推广,2010年因为我辞职休息,我就想到把AgileEAS.NET推向市场,让更多的人使用。</p>
<p> 我的技术团队成员都是合作多年的老朋友,因为这个平台是免费的,所以也没有什么收入,都是由程序员的那种理想与信念坚持,在此我感谢一起奋斗的朋友。</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]