黄色网页视频 I 影音先锋日日狠狠久久 I 秋霞午夜毛片 I 秋霞一二三区 I 国产成人片无码视频 I 国产 精品 自在自线 I av免费观看网站 I 日本精品久久久久中文字幕5 I 91看视频 I 看全色黄大色黄女片18 I 精品不卡一区 I 亚洲最新精品 I 欧美 激情 在线 I 人妻少妇精品久久 I 国产99视频精品免费专区 I 欧美影院 I 欧美精品在欧美一区二区少妇 I av大片网站 I 国产精品黄色片 I 888久久 I 狠狠干最新 I 看看黄色一级片 I 黄色精品久久 I 三级av在线 I 69色综合 I 国产日韩欧美91 I 亚洲精品偷拍 I 激情小说亚洲图片 I 久久国产视频精品 I 国产综合精品一区二区三区 I 色婷婷国产 I 最新成人av在线 I 国产私拍精品 I 日韩成人影音 I 日日夜夜天天综合

DataRabbit 輕量的數(shù)據(jù)訪問框架(02) -- IOr

系統(tǒng) 1950 0
(完全限定類名:DataRabbit.ORM.IOrmAccesser)

在DataRabbit框架中,通過(guò)IOrmAccesser來(lái)對(duì)數(shù)據(jù)庫(kù)進(jìn)行ORM訪問,只要Entity(即ORM中的“O”)的定義與數(shù)據(jù)庫(kù)表的結(jié)構(gòu)完全一致,即可使用IOrmAccesser來(lái)對(duì)其進(jìn)行ORM操作。

1.Entity
Entity除了包括成員變量與屬性(這些變量與屬性與數(shù)據(jù)庫(kù)表的結(jié)構(gòu)完全一致)外,不需要包含任何其它元素。在 輕量的數(shù)據(jù)訪問框架 --序 的例子代碼中,我們已經(jīng)看到了一個(gè)Student Entity的示例。

2.Filter
我們經(jīng)常需要依據(jù)條件來(lái)搜索數(shù)據(jù),在DataRabbit的ORM框架中,使用Filter來(lái)表示一個(gè)單獨(dú)的條件。Filter從ColumnItem繼承,ColumnItem 表示數(shù)據(jù)列及其對(duì)應(yīng)的值。比如,在進(jìn)行Update操作時(shí),我們可以使用一個(gè)ColumnItem 的List來(lái)指定要將哪些列的值更新為指定的值。
DataRabbit 輕量的數(shù)據(jù)訪問框架(02) -- IOrmAccesser
首先,注意,F(xiàn)ilter中包含一個(gè)GetBooleanExpression()方法,該方法將當(dāng)前Filter轉(zhuǎn)換為一個(gè)標(biāo)準(zhǔn)的Sql條件字句。
Filter的ComparisonOperator屬性表明了采用何種比較符來(lái)構(gòu)建條件表達(dá)式。
ComparisonOperators
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--> [EnumDescription( " 比較操作符 " )]
public enum ComparisonOperators
{
[EnumDescription(
" = " )]
Equal,
[EnumDescription(
" != " )]
NotEqual,
[EnumDescription(
" > " )]
Greater,
[EnumDescription(
" < " )]
Less,
[EnumDescription(
" >= " )]
NotLessThan,
[EnumDescription(
" <= " )]
NotGreaterThan,
[EnumDescription(
" like " )]
Like
}
在IOrmAccesser接口中,很多方法都接受 params Filter[] conditions 或IList<Filter>參數(shù),比如:
void Delete(IList < Filter > conditions);
void Delete( params Filter[]conditions);
比如,要?jiǎng)h除數(shù)據(jù)庫(kù)Student表中所有Age大于20歲且為男性的學(xué)生記錄
stuOrmAccesser.Delete( new Filter(Student._Age, 20 ,ComparisonOperators.Greater), new Filter(Student._IsBoy, true ,ComparisonOperators.Equal));

針對(duì)接受 params Filter[] conditions 或IList<Filter>參數(shù)的方法,在OrmAccesser內(nèi)部將會(huì)對(duì)每個(gè)Filter所表示的單個(gè)條件進(jìn)行“與”操作,來(lái)作為搜索條件。那么如果需要對(duì)各個(gè)Filter進(jìn)行“或”操作,或進(jìn)行更復(fù)雜的邏輯組合(如“filter1 && (filter2 || filter3)”),就需要采用對(duì)應(yīng)的接受IFilterTree作為參數(shù)的重載方法。

3.IFilterTree
IFilterTree 用于表示多個(gè)Filter的邏輯組合。
DataRabbit 輕量的數(shù)據(jù)訪問框架(02) -- IOrmAccesser
注意,IFilterTree中也包含一個(gè)GetBooleanExpression()方法,該方法將當(dāng)前Filter通過(guò)邏輯組合轉(zhuǎn)換為一個(gè)標(biāo)準(zhǔn)的Sql條件字句。
當(dāng)前的IFilterTree有兩個(gè)默認(rèn)實(shí)現(xiàn):
(1)SimpleFilterTree
該實(shí)現(xiàn)僅僅支持最簡(jiǎn)單的對(duì)多個(gè)條件都進(jìn)行“與”或都進(jìn)行“或”的邏輯操作,更復(fù)雜的邏輯組合需求,可以使用AgileFilterTree。
如果將上述的例子,改用IFilterTree可以這樣實(shí)現(xiàn):
IList < Filter > conditions = new List < Filter > ();
conditions.Add(
new Filter(Student._Age, 20 ,ComparisonOperators.Greater));
conditions.Add(
new Filter(Student._IsBoy, true ,ComparisonOperators.Equal));
IFilterTree conditionTree
= new SimpleFilterTree (LogicType.And,conditions);
stuOrmAccesser.Delete(conditionTree);

(2)AgileFilterTree
AgileFilterTree 可以表示非常復(fù)雜的多個(gè)Filter的邏輯組合。它使用一個(gè)logicExpression字符串描述邏輯組合表達(dá)式,如"filter1 && (filter2 || filter3)",然后解析這個(gè)表達(dá)式獲取正確的Sql條件語(yǔ)句。
比如,我們要找出所有年齡在20與25歲之間,或者名字為sky的學(xué)生:
IDictionary < string ,Filter > mapping = new Dictionary < string ,Filter > ();
mapping.Add(
" A " , new Filter (Student._Name, " sky " ,ComparisonOperators.Equal));
mapping.Add(
" B " , new Filter (Student._Age, 20 ,ComparisonOperators.Greater));
mapping.Add(
" C " , new Filter (Student._Age, 25 ,ComparisonOperators.Less));
IFilterTreeagileTree
= new AgileFilterTree ( " A||(B&&C) " ,mapping);

IList <Student> list = stuOrmAccesser.GetMuch(agileTree);


4.IOrmAccesser的泛型參數(shù)
IOrmAccesser是一個(gè)泛型接口,泛型參數(shù)是EntityType--即實(shí)體的類型,我們知道,每個(gè)EntityType對(duì)應(yīng)著數(shù)據(jù)庫(kù)中的一個(gè)表,Entity class的名字最好與數(shù)據(jù)表的名字一致,這樣IOrmAccesser就可以根據(jù)EntityType知道要訪問數(shù)據(jù)庫(kù)中的哪個(gè)表。如果Entity class的名字最好與數(shù)據(jù)表的名字不一致,也沒關(guān)系,我們可以通過(guò)向IDataAccesser的OrmCoagent屬性注入IOrmCoagent來(lái)提供EntityType與數(shù)據(jù)表名稱的映射關(guān)系。IOrmCoagent接口定義如下:
public interface IOrmCoagent
{
/// <summary>
/// GetTableName根據(jù)Entity類型獲取對(duì)應(yīng)的數(shù)據(jù)庫(kù)表名
/// </summary>
string GetTableName(TypeentityType);
}
IOrmAccesser可以通過(guò)IOrmCoagent的GetTableName()方法來(lái)獲取EntityType所對(duì)應(yīng)的數(shù)據(jù)庫(kù)表的名稱。

5.基本"CRUD"方法

IOrmAccesser提供了基本的“CRUD”方法,如Insert,Update,Delete,GetOne,GetMuch,GetDataSet等等。這些方法都提供了多個(gè)重載,以接收單個(gè)Filter條件或多個(gè)Filter以及IFilterTree。
大多數(shù)方法的含義都特別清晰明了,有幾個(gè)方法的含義需要特別指出一下:
/// <summary>
/// GetMuchWithoutBlob根據(jù)參數(shù)conditions來(lái)提取符合條件的所有Entity,但是Entity的blob字段沒有被填充。
/// </summary>
IList < EntityType > GetMuchWithoutBlob( params Filter[]conditions);

/// <summary>
/// LoadBlob填充entity的Blob字段
/// </summary>
void LoadBlob(EntityTypeentity);
/// <summary>
/// Update更新符合conditions的記錄中由columnItems指定的各個(gè)Column為對(duì)應(yīng)目標(biāo)值。
/// </summary>
void Update(IList < ColumnItem > columnItems,IList < Filter > conditions);

/// <summary>
/// GetDataSet選取表中符合條件的row,并且只返回columns指定的列。
/// </summary>
DataSetGetDataSet(IList < Filter > conditions, params string []columns);

6.基于主外鍵關(guān)系進(jìn)行Get獲取
IOrmAccesser會(huì)自動(dòng)依據(jù)數(shù)據(jù)表的主外鍵關(guān)系來(lái)進(jìn)行關(guān)系加載,比如,Student表中有MentorID字段(外鍵),對(duì)應(yīng)Mentor表中的主鍵。那么,IOrmAccesser的GetParent方法,就可以根據(jù)指定的Student對(duì)象返回Mentor對(duì)象。
Mentormentor = stuOrmAccesser.GetParent < Mentor > (student);
基于主外鍵關(guān)系進(jìn)行Get的方法包括:
/// <summary>
/// GetParent依據(jù)entity中外鍵的值,獲取主表中的實(shí)體。外鍵建立了"語(yǔ)義"上的"Master-Detail"關(guān)系
/// </summary>
ParentTypeGetParent < ParentType > (EntityTypeentity);

/// <summary>
/// GetForeigner依據(jù)entity中名為fkeyName外鍵的值,獲取主表中的對(duì)應(yīng)實(shí)體。外鍵沒有"語(yǔ)義"上的"Master-Detail"關(guān)系
/// </summary>
ForeignerTypeGetForeigner < ForeignerType > (EntityTypeentity, string fkeyName);

/// <summary>
/// GetChildList依據(jù)entity中主鍵的值,獲取從表中的所有相關(guān)實(shí)體
/// </summary>
IList < ChildType > GetChildList < ChildType > (EntityTypeentity);

/// <summary>
/// GetChildDataSet依據(jù)entity中主鍵的值,獲取從表中的所有相關(guān)記錄
/// </summary>
DataSetGetChildDataSet < ChildType > (EntityTypeentity);
#endregion

本文簡(jiǎn)單介紹了IOrmAccesser的一些基本功能和使用,在后面的文章中將介紹一些IOrmAccesser 高級(jí)用法


返回到: 輕量的數(shù)據(jù)訪問框架 --序



DataRabbit 輕量的數(shù)據(jù)訪問框架(02) -- IOrmAccesser


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論