概要:
對於一張表,可能存在多重型別。我們可以用繼承來定義它們。
實體關係的應用,解決資料表和表之間一些複雜問題。
內容:
論壇主題表 dbo.topics:
欄位名
字段型別
可空
備註
topicid
intnot null
identity/主鍵
topictitle
varchar(50)
not null
topiccontent
varchar(max)
not null
parenttopic
intnull
如果帖子是主題貼這個欄位為null,否則就是所屬主題id
topictype
tinyint
not null
0 – 主題貼
1 – 回覆帖
定義實體類父類:包含都存在的部分字段。
然後定義可能出現的子類。
再定義各個類和字段的特性。
。。)]判斷型別
用[column(isdiscriminator=true)]標示判斷依據
//基類
[table(name="topics")]
public class topic
[column(isprimarykey=true,isdbgenerated=true)]
public int topicid
[column]
public string topictitle
[column]
public string topiccontent
[column(isdiscriminator=true)]
public int topictype
//新帖,topictype=0,且主題欄位parenttopic為null,即不存在
public class newtopic : topic
public newtopic()
base.topictype = 0;
//回覆貼,帖子型別topictype=1,且主題欄位為主題帖id
public class reply : topic
public reply()
base.topictype = 1;
[column]
public int parenttopic
定義完實體類,下面就是使用方法,首先定義datacontext:
//定義datacontext類
public partial class bbscontext : datacontext
public tabletopics;
public bbscontext(string connection) : base(connection)
讀出來topic類,然後foreach逐行判斷型別,然後再轉換型別:
bbscontext ctx = newbbscontext("");
var query = from c in ctx.topics select c;
foreach(topic t in query )
if (t is newtopic)
newtopic newtopic = t asnewtopic;
//newtopic就是可以使用的newtopic型別
else if(t is reply)
reply reply = t asreply;
//reply就是可以使用的reply型別
或直接使用:
ienumerabletb = (from t inctx.topics.oftype() select t).tolist();
replyrpl =ctx.topics.oftype().single(reply=> reply.topicid == 8);
實體關係的使用:
1、 論壇版塊分類表 dbo.categories:
欄位名
字段型別
可空
備註
categoryid
intnot null
identity/主鍵
categoryname
varchar(50)
not null
2、 論壇版塊表 dbo.boards:
欄位名
字段型別
可空
備註
boardid
intnot null
identity/主鍵
boardname
varchar(50)
not null
boardcategory
intnot null
對應論壇版塊分類表的categoryid
實體類:
[table]
public class categories
public categories()
this._boards = newentityset();
private entityset_boards;
[association(thiskey="category",storage="_boards")]
public entitysetboards
get
set
[column(isprimarykey=true,isdbgenerated=true)]
public int categoryid
[column]
public string categoryname
[table]
public class boards
[association(thiskey="category",storage="_category")]
public categories category
get
setthis._category.entity = value;
value.boards.add(this );
private entityref_category;
[column(isprimarykey=true,isdbgenerated=true)]
public int boardid
[column]
public string boardname
[column]
public int boardcategory
使用:response.write("-------------查詢分類為1的版塊-------------
");var query1 = fromb in ctx.boards whereb.category.categoryid == 1 select b;
foreach (boardb in query1)
response.write(b.boardid + " " + b.boardname + "
");response.write("-------------查詢版塊大於2個的分類-------------
");var query2 = fromc in ctx.boardcategories where c.boards.count > 2 selectc;
foreach (boardcategoryc in query2)
response.write(c.categoryid + " " + c.categoryname + " " +c.boards.count + "
");使用:
dataloadoptionsoptions = new dataloadoptions();
options.loadwith(c => c.boards);
ctx.loadoptions = options;
response.write("-------------查詢版塊大於2個的分類-------------
");varquery2 = from c inctx.boardcategories where c.boards.count > 2select c;
foreach(boardcategory c inquery2)
response.write(c.categoryid + " " + c.categoryname + " " +c.boards.count + "
");使用:
boardcategory dbcat= new boardcategory();
boardoracle = new board();
ctx.boardcategories.add(dbcat);
ctx.submitchanges();
繼承與組合關係
其中乙個編輯原則是 少用繼承多用組合 這句經典的話其實很容易明白,因為在編寫 路上很快就遇到這問題,也很快就明白為什麼,但我為什麼又要記入和?因為我有另乙個層次的體會 在繼承中我們無法呼叫繼承物件,而組合物件誰都可以呼叫。就這句是我體會到的 舉個例子 孩子繼承父親,孩子擁有父親的物件,在呼叫時chi...
c 友元關係與繼承
友元關係不能繼承。基類的友元對派生類的成員沒有特殊訪問許可權。如果基類被授予友元關係,則只有基類具有特殊訪問許可權,該基類的派生類不能訪問授予友元關係的類。class base frnd has no access to members in d1 class d1 public base clas...
Java 繼承與介面的關係
在看netty中nioeventloop的uml圖時,感覺非常複雜,如下圖所示 找不到重點,找不到主線,此時內心生無可戀。從而,激發出困擾了我很久的乙個問題 到底繼承與介面 啥關係?這個問題,前幾天也請教過同事,也並沒有說出什麼關鍵點來。然後,對著此圖沉思了良久,終於悟出一點自己的見解 以下僅供參考...