MySoft组件之MySoft.Data更新日志
MySoft ORM組件
新版組件與之前版本不兼容,實(shí)體需要重新生成
鑒于功能的擴(kuò)展,某些類(lèi)重構(gòu)過(guò),方法也有所變動(dòng),使用方法基本保持與之前一致
生成工具可以直接生成對(duì)應(yīng)的實(shí)體類(lèi),而不再需要新建一個(gè)項(xiàng)目
原有的方式仍然保留,為了方便設(shè)計(jì)自定義接口
版本號(hào):1.6.0
1. MySoft.Data批處理和事務(wù)處理。
2. 將Trans更名為DbTrans,BeginTran方法更名為BeginTrans,新增DbBatch類(lèi)。
??? public void AddMessages(Message[] msgs)
??? {
??????? //使用批處理
??????? DbBatch batch = DbSession.Default.BeginBatch();
??????? for (int index = 0; index < msgs.Length; index++)
??????? {
??????????? batch.Save(msgs[index]);
??????? }
??????? batch.Process();
??????? //使用帶事務(wù)批處理
??????? DbTrans tran = DbSession.Default.BeginTrans();
??????? DbBatch batch1 = tran.BeginBatch();
??????? for (int index = 0; index < msgs.Length; index++)
??????? {
??????????? batch1.Save(msgs[index]);
??????? }
??????? batch1.Process();
??????? tran.Commit();
??????? //使用單條處理
??????? for (int index = 0; index < msgs.Length; index++)
??????? {
??????????? DbSession.Default.Save(msgs[index]);
??????? }
??????? //使用帶事務(wù)單條處理
??????? DbTrans tran1 = DbSession.Default.BeginTrans();
??????? for (int index = 0; index < msgs.Length; index++)
??????? {
??????????? tran1.Save(msgs[index]);
??????? }
??????? tran1.Commit();
??? }
版本號(hào):1.7.6
??? 新增IDataPage類(lèi),通過(guò)此類(lèi)來(lái)支持HtmlPager操作
??? 使用如下:
??? IDataPage<Message[]> msgInfo = new DataPage<Message[]>(5);
??? msgInfo.RowCount = 15;
??? msgInfo.DataSource = null;
??? string linkFormat = "javascript:gotoPage($PageIndex);";
??? HtmlPager pager = new HtmlPager(msgInfo, linkFormat, 5);
??? pager.NextPageTitle = "Next Page";
??? pager.PrevPageTitle = "Prev Page";
??? pageHtml = pager.ToString();
版本號(hào):1.7.8
1. MySoft.Data修正Entity在Remoting中系列化的問(wèn)題
2. 修正了OrderByClip和WhereClip在Remoting中生成sql不正確的問(wèn)題
版本號(hào):1.8.0.0
??? 修正了條件查詢(xún)時(shí)值存在’符號(hào)產(chǎn)生的錯(cuò)誤!
版本號(hào):2.0
1.MySoft.Data中新增了子查詢(xún)功能SubQuery操作
??? DbSession.Default.From<Message>().SubQuery().Select(Message._.ID, Message._.PostTime.Max()).GroupBy(Message._.ID.GroupBy).ToArray();
??? 生成的SQL語(yǔ)句如下:
??? select Message.id,max(Message.posttime) as posttime from(select *from Message) as Message
??? DbSession.Default.From<Message>().SubQuery("c").Select(Message._.ID.At("c"), Message._.PostTime.At("c").Max()).GroupBy(Message._.ID.At("c").GroupBy).ToArray();
??? 生成的SQL語(yǔ)句如下:
??? select c.id,max(c.posttime) as posttime from(select *from Message) as c
??? group by c.id
2.MySoft.Data中修正了枚舉類(lèi)型從數(shù)據(jù)庫(kù)讀取后轉(zhuǎn)換的問(wèn)題
版本號(hào):2.1.0
??? ORM新增內(nèi)存查詢(xún)功能
??? MemoryFrom<Message> query = DbSession.Default.From<Message>().ToMemory();? //獲取主鍵為1的Message信息
??? Message msg = query.Get(1);? //獲取ID為1,2,3的數(shù)組
??? Message[] msgs1 = query.Where(Message._.ID.In(1,2,3)).ToArray();
??? //獲取按分頁(yè),每頁(yè)10條中的第3頁(yè),Message._.ID是必須的,可以指定為任意列
??? Message[] msgs2 = query.GetPage(Message._.ID,10).ToArray(3);
??? bool exist = query.Exists(Message._.ID == 1);
??? object obj = query.Where(Message._.ID == 1).Sum(Message._.ID);
版本號(hào):2.1.5
1.新增Union操作及分頁(yè)處理,進(jìn)行Union操作的實(shí)體同樣可以進(jìn)行分頁(yè)操作
2.修正關(guān)聯(lián)實(shí)體對(duì)于多關(guān)聯(lián)在Access中的出錯(cuò)的bug
3.全面修正Access中分頁(yè)查詢(xún)的bug
4.修正Join操作中如果用別名,不選擇字段出現(xiàn)表名不正確的bug
5.修改EntityDisign中對(duì)關(guān)聯(lián)實(shí)體中的字段名與屬性名不對(duì)應(yīng)的問(wèn)題
? 如設(shè)計(jì)的字段名為{ID},但無(wú)法找到此屬性名或ID沒(méi)有用{}括起來(lái),則會(huì)報(bào)錯(cuò)。
6.修正Oracle、MySql、SQLite、FireBird獲取插入數(shù)據(jù)后獲取當(dāng)前記錄號(hào)不正確的bug
版本號(hào):2.2.5
1.修正了在項(xiàng)目開(kāi)發(fā)中一些不經(jīng)常出現(xiàn)的bug
2.批處理中加入返回錯(cuò)誤列表
3.增加了自定義表名的處理,很多情況下,表需要做分表處理,以往單一表名的定義
??? 已經(jīng)不能適應(yīng)這種情況的處理,所以需要傳入表名以操作某一特定的表
??? 下面功能將user實(shí)體保存到表UserTest
??? DbSession.Default.Save<User>(new Table("UserTest"),user);
中間過(guò)度版本2.4.0,以下更新將與之前版本不兼容
......
版本號(hào):2.5.0
1.增加了增、刪、改、查創(chuàng)建器
??? QueryCreater??? 查詢(xún)創(chuàng)建器
??? InsertCreator??? 插入創(chuàng)建器
??? UpdateCreator??? 修改創(chuàng)建器
??? DeleteCreator??? 刪除創(chuàng)建器
2.支持不帶泛型的數(shù)據(jù)庫(kù)查詢(xún)方式。
??? QueryCreator q = QueryCreator.NewCreator()
??????? .From("user")
??????? .AddField("userid")
??????? .AddField("username")
??????? .AddWhere("groupid",1);
??? DbSession.Default.From(q).ToTable();
??? DbSession.Default.From(q).ToList<T>();
??? DbSession.Default.From(q).ToListPage<T>();
3.完美支持Oracle,FireBird,SQLite
4.可以生成不帶屬性變更的方法,需設(shè)置EntityDesignConfig.xml
??? EnabledPropertyValueChange 為true,則生成,反之不生成
??? 對(duì)于多線(xiàn)程操作時(shí),可以選擇不生成OnPropertyValueChange方法,可以提高性能
版本號(hào):2.5.6
1.修正了多個(gè)主鍵時(shí)使用Get(params object[] pkValues) 會(huì)出錯(cuò)的bug;
2.修正了使用Oracle驅(qū)動(dòng)時(shí)間格式不是yyyy-MM-dd HH:mm:ss時(shí),查詢(xún)數(shù)據(jù)出錯(cuò)的bug;
3.新增新的分布類(lèi)方式獲取數(shù)據(jù),如:
??? 系統(tǒng)已經(jīng)有一個(gè)User實(shí)體
??? public partial class User {
??????? public int UserID { get;set;}
??????? public string UserName {get;set;}
??? }
??? 現(xiàn)在為User擴(kuò)展一個(gè)屬性
??? public partial class User {
??????? public string GroupName {get; private set;} //對(duì)外只讀
??????? protected override void SetExtValues(ISourceReader reader)
??????????? {
??????????????? if (false == reader.IsDBNull("GroupName"))
??????????????? {
??????????????????? this.GroupName = reader.GetString("GroupName");
??????????????? }
??????????? }
??????? }
??? DbSession.Default.From<User>().LeftJoin<Group>(User._.GroupID == Group._.GroupID)
??? .Select(User._.All,Group._.GroupName).ToList();
??? 這樣User就擁有GroupName屬性了,而不需要重新設(shè)計(jì)一個(gè)實(shí)體
??? 而且多出的屬性不會(huì)影響到新增與修改操作
版本號(hào):2.5.8
1.增加了ISourceList類(lèi),實(shí)現(xiàn)了對(duì)數(shù)據(jù)進(jìn)行分組的功能
??? ISourceList source = new SourceList(IList<User> list);
??? source.ToDictionary<int>(User._.GroupID);
??? 或
??? source.ToDictionary<int>("GroupID");
??? IArrayList 接口還有若干其它方法
2.強(qiáng)化了內(nèi)存查詢(xún)方式
??? ISourceList source = new SourceList(IList<User> list);
??? MemoryFrom<User> mf = source.ToMemory();
??? 或
??? MemoryFrom<User> mf = DbSession.Default.From<User>().ToMemory();
??? mf.Where(User._.UserID == 1).ToSingle();
??? mf.Where(User._.GroupID == 1).OrderBy(User._.AddTime.Desc).ToList();
??? //獲取第2頁(yè),每頁(yè)2條
??? mf.Where(User._.GroupID == 1).GetPage(2).ToList(2);
3.將DataPage修改成DataPage以免與System.Data.DataPage沖突
? 將ToDataView()方法改為T(mén)oListPage()
版本號(hào):2.6.0
1.將WhereClip的生成參數(shù)化,徹底解決sql注入的問(wèn)題
2.強(qiáng)化了QueryCreator的功能
??? QueryCreator q = QueryCreator.NewCreator()
??????? .From<User>()
??????? .Join<Group>(User._.GroupID == Group._.GroupID)
??????? .AddField(User._.All)
??????? .AddField(Group._.GroupName);
??? 或
??? QueryCreator q = QueryCreator.NewCreator()
??????? .From("user")
??????? .Join("group","user.groupid = group.groupid")
??????? .AddField("user","*")
??????? .AddField("group","groupname");
??? DbSession.Default.From(q).ToList<User>();
??? DbSession.Default.From(q).ToTable();
3.支持表前綴的后期設(shè)置
??? 在web項(xiàng)目中添加一個(gè)EntityConfig.xml方法,配置如下
??? <?xml version="1.0" encoding="utf-8" ?>
??? <ArrayOfPrefixSetting xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
????????? <PrefixSetting Name="Default" Value="tb_" />
????????? <PrefixSetting Name="EntityNamespace" Value="tb_" />
??? </ArrayOfPrefixSetting>
??? Default:如未設(shè)置EntityNamespace,則默認(rèn)使用此前綴
??? EntityNamespace: 實(shí)體程序集命名空間,如Simple.Entity
??? EntityNamespace可以多個(gè),這樣不同的命令空間可以使用不同的前綴
??? 方便解決多個(gè)應(yīng)用程序使用同一數(shù)據(jù)的問(wèn)題
版本號(hào):2.6.5
1.修正了復(fù)雜條件使用參數(shù)化時(shí)產(chǎn)生的bug,比如子查詢(xún) In(Query),Union聯(lián)合查詢(xún)
2.新增MySql驅(qū)動(dòng),需要加載MySql.Data.dll
3.新增數(shù)據(jù)類(lèi)型IArrayList<T> ISourceList<T> ISourceTable,ISourceReader
??? 使用以上幾種類(lèi)型可以大大加強(qiáng)返回的數(shù)據(jù)可操作性
??? ISourceReader接口實(shí)現(xiàn)了按fieldName,Field來(lái)獲取數(shù)據(jù)
??? IArrayList實(shí)現(xiàn)了ToArray方法
??? ISourceList實(shí)現(xiàn)了數(shù)據(jù)轉(zhuǎn)換ConvertTo方法,ToGroup方法及ToMemory方法
??? ISourceTable實(shí)現(xiàn)了ToList<T>方法及ToMemory方法
??? Get<T>()方法更改為Single<T>()方法,返回單一實(shí)體
??? ToFirst()方法更改為T(mén)oSingle()方法
??? ToList方法不變,但返回類(lèi)型為ISourceList
??? ToDataTable方法更改為T(mén)oTable,返回類(lèi)型為ISourceTable
??? ToDataReader方法更改為T(mén)oReader,返回類(lèi)型為ISourceReader
4.新增接口編程方法,可以對(duì)應(yīng)用程序進(jìn)行解耦,使用如下:
??? public interface IUser {
??????? UserID { get;set;}
??????? UserName {get;set;}
??? }
??? public class User : IUser {
??????? public int UserID { get;set;}
??????? public string UserName {get;set;}
??? }
??? 以下ToList()返回類(lèi)型ISourceList<T>,可以使用ConvertTo<T>方法進(jìn)行數(shù)據(jù)的轉(zhuǎn)換輸出
??? IList<IUser> list = DbSession.Default.From<User>().ToList().ConvertTo<IUser>();
??? DbSession.Default.Save(IUser as User);
5.新增了DataUtils.ConvertType<T,TOutput>方法,支持字符串?dāng)?shù)據(jù)類(lèi)型的轉(zhuǎn)換
??? public class User1 {
??????? public string UserID { get;set;}
??????? public string UserName {get;set;}
??????? public string BornDate { get;set; }
??? }
??? public class User2 {
??????? public int UserID { get;set;}
??????? public string UserName {get;set;}
??????? public DateTime BornDate { get;set; }
??? }
??? User1 user1 = new User1() { UserID = "1", UserName = "test", BornDate = "2009-09-10" };
??? User2 user2 = DataUtils.ConvertType<User1,User2>(user1);
版本號(hào):2.6.6
1.優(yōu)化了Oracle分頁(yè)數(shù)據(jù)查詢(xún)的性能
版本號(hào):2.6.8
1.修正了獲取前N條記錄時(shí)返回結(jié)果不正確的bug
??? .GetTop(5).ToList() 之前返回為全部數(shù)據(jù)
??? 對(duì)Top結(jié)構(gòu)進(jìn)行了重構(gòu),增加了In語(yǔ)法時(shí)的Top查詢(xún)
2.修正了Access驅(qū)動(dòng)分頁(yè)查詢(xún)時(shí)參數(shù)處理錯(cuò)誤的bug
3.對(duì)Insert,Delete,Update操作內(nèi)核進(jìn)行了重要重構(gòu)
4.新增加了對(duì)postgreSQL數(shù)據(jù)庫(kù)的支持
版本號(hào):2.7.0
1.增加從ISourceReader輸出為L(zhǎng)ist的方法
2.增加了對(duì)Oracle系列名稱(chēng)的自定義
public class UserGroupInfo
{
??? public int UserID { get; private set; }
??? public string UserName { get; private set; }
??? public string GroupName { get; private set; }
}
//先返回ISourceReader,然后再返回List;
IList<UserGroupInfo> list = DbSession.Default.From<User>()
??????????????????????????? .LeftJoin<Group>(User._.GroupID == Group._.GroupID)
??????????????????????????? .Select(User._.UserID,User._.UserName,Group._.GroupName)
??????????????????????????? .ToReader() 或者 .ToTable()
??????????????????????????? .ToList<UserGroupInfo>();
如果輸出的列與屬性值不能,可以使用MySoft.Data.Design.Mapping進(jìn)行標(biāo)注:
如字段名為UserID,屬性名稱(chēng)為ID 可以使用如下方式處理
public class UserGroupInfo : IUserGroupInfo
{
??? [MySoft.Data.Design.Mapping("UserID")]
??? public int ID { get; private set; }
??? public string UserName { get; private set; }
??? public string GroupName { get; private set; }
}
//先返回ISourceReader,然后再返回List;
IList<UserGroupInfo> list = DbSession.Default.From<User>()
??????????????????????????? .LeftJoin<Group>(User._.GroupID == Group._.GroupID)
??????????????????????????? .Select(User._.UserID,User._.UserName,Group._.GroupName)
??????????????????????????? .ToReader() 或者 .ToTable()
??????????????????????????? .ToList<UserGroupInfo>();
如果此時(shí)使用接口
public interface IUserGroupInfo
{
??? int ID { get; private set; }
??? string UserName { get; }
??? string GroupName { get; }
}
可以使用以下方法轉(zhuǎn)換:
IList<IUserGroupInfo> ilist = list.ConvertTo<IUserGroupInfo>();
3.新增對(duì)象多屬性排序的類(lèi)
??? SortComparer<Entity> c = new SortComparer<Entity>(
??????????? new SortProperty("PropertyName1").Asc,
??????????? new SortProperty("PropertyName2").Desc,
??????????? new SortProperty("PropertyName31").Asc);
??? new List().Sort(c);
版本號(hào):2.7.2
1.修正了Field.IsNull()條件返回錯(cuò)誤的bug;
2.修正直接用sql進(jìn)行查詢(xún)或操作時(shí),不用參數(shù)化值全部變?yōu)榇髮?xiě)的bug.
? 之前是為了適應(yīng)Oracle必須為大寫(xiě)的需求,現(xiàn)在已經(jīng)修正。
? 對(duì)Oracle進(jìn)行個(gè)別特殊處理即可
3.修正了where條件參數(shù)化后無(wú)法進(jìn)行緩存的bug.
? 之前是用sql進(jìn)行緩存,而參數(shù)化后每次生成的參數(shù)名稱(chēng)不相同,導(dǎo)致緩存無(wú)效。
? 解決辦法:將參數(shù)的值替換成sql中的參數(shù),從而達(dá)到sql一致
4.修正了條件為枚舉時(shí)返回的結(jié)果不正確的bug
5.修正了調(diào)用CacheOff()與CacheOn()方法出錯(cuò)的bug
下一步開(kāi)發(fā)計(jì)劃(MySoft.Data v3.0):
1、增加實(shí)體驗(yàn)證處理 EntityValidator<T>
2、增加MySoft.Data.Linq驅(qū)動(dòng)
轉(zhuǎn)載于:https://www.cnblogs.com/maoyong/archive/2010/03/01/1675749.html
與50位技術(shù)專(zhuān)家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的MySoft组件之MySoft.Data更新日志的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 移动端vant时间选择器_vue移动端组
- 下一篇: 安卓模拟器不能上网时可尝试更改成谷歌DN