|
系列文章導(dǎo)航:
不能不說的C#特性-迭代器(上)及一些研究過程中的副產(chǎn)品
不能不說的C#特性-迭代器(下),yield以及流的延遲計算
走進(jìn)Linq-Linq to Objects(上)基礎(chǔ)篇
走進(jìn)Linq-Linq to Objects(下)實例篇
走進(jìn)Linq-Linq to SQL感性認(rèn)識篇
走進(jìn)Linq-Linq to SQL How do I(1)
走進(jìn)Linq-Linq to SQL How do I(2)
走進(jìn)Linq-Linq to SQL How do I(3)
走進(jìn)Linq-How do I(4)拾遺補零篇第一節(jié)
走進(jìn)Linq-Linq to SQL源代碼賞析 Table
走進(jìn)Linq-Linq to SQL源代碼賞析之Provider的初始化
走進(jìn)Linq-Linq to SQL源代碼賞析,通過Linq to SQL看Linq
本篇是Linq to SQL How do I的第二篇,難度系數(shù)100,定位為進(jìn)階級。
內(nèi)容 l 對象之間的關(guān)系 |
對象之間的關(guān)系
既然是對象-關(guān)系映射,各個表之間肯定不是獨立存在的(如果都是獨立存在的,也沒有必要用關(guān)系數(shù)據(jù)庫了),那么就必然涉及到幾個表之間的聯(lián)合了。
Linq to SQL和SQL語句一樣,支持兩種方式的聯(lián)合:
1. 利用where子句,對兩個表進(jìn)行查找
2. 使用join子句
我們還是用例子來說明吧,現(xiàn)在要對blogs和posts進(jìn)行查詢,傳入一篇文章的id的時候,找出這篇文章相關(guān)信息的同時還要找出這篇文章屬于哪個博客,接著上篇的例子,我們首先得給Blog類加上映射:

系列文章導(dǎo)航:
不能不說的C#特性-迭代器(上)及一些研究過程中的副產(chǎn)品
不能不說的C#特性-迭代器(下),yield以及流的延遲計算
走進(jìn)Linq-Linq to Objects(上)基礎(chǔ)篇
走進(jìn)Linq-Linq to Objects(下)實例篇
走進(jìn)Linq-Linq to SQL感性認(rèn)識篇
走進(jìn)Linq-Linq to SQL How do I(1)
走進(jìn)Linq-Linq to SQL How do I(2)
走進(jìn)Linq-Linq to SQL How do I(3)
走進(jìn)Linq-How do I(4)拾遺補零篇第一節(jié)
走進(jìn)Linq-Linq to SQL源代碼賞析 Table
走進(jìn)Linq-Linq to SQL源代碼賞析之Provider的初始化
走進(jìn)Linq-Linq to SQL源代碼賞析,通過Linq to SQL看Linq
生成的SQL語句是:

大家看到,Linq to SQL使用inner join子句。
但是Linq to SQL在使用join的時候并不是像SQL那樣寬松,把上面的SQL語句貼下來:
SELECT [t0].[blogname] AS [BlogName],[t1].[Title] AS [PostTitle],[t1].[Body] AS [PostBody] FROM [blogs] AS [t0] INNER JOIN [posts] AS [t1] ON [t0].[blogid] = [t1].[BlogId] WHERE [t1].[postid] = @p0系列文章導(dǎo)航:
不能不說的C#特性-迭代器(上)及一些研究過程中的副產(chǎn)品
不能不說的C#特性-迭代器(下),yield以及流的延遲計算
走進(jìn)Linq-Linq to Objects(上)基礎(chǔ)篇
走進(jìn)Linq-Linq to Objects(下)實例篇
走進(jìn)Linq-Linq to SQL感性認(rèn)識篇
走進(jìn)Linq-Linq to SQL How do I(1)
走進(jìn)Linq-Linq to SQL How do I(2)
走進(jìn)Linq-Linq to SQL How do I(3)
走進(jìn)Linq-How do I(4)拾遺補零篇第一節(jié)
走進(jìn)Linq-Linq to SQL源代碼賞析 Table
走進(jìn)Linq-Linq to SQL源代碼賞析之Provider的初始化
走進(jìn)Linq-Linq to SQL源代碼賞析,通過Linq to SQL看Linq
一對多關(guān)系
在上面的映射中,Blog還有一個屬性:Posts,我們并沒有做什么處理,實際上這個應(yīng)該是根據(jù)Blog的Id屬性關(guān)聯(lián)到Post的BlogId屬性,進(jìn)行關(guān)聯(lián)的。
為此我們要修改一下這個Blog的映射:
////// 一個博客有零篇或多篇文章,
///
[Association(OtherKey = "BlogId")]
public EntitySet<Post> Posts { get; set; }
系列文章導(dǎo)航:
不能不說的C#特性-迭代器(上)及一些研究過程中的副產(chǎn)品
不能不說的C#特性-迭代器(下),yield以及流的延遲計算
走進(jìn)Linq-Linq to Objects(上)基礎(chǔ)篇
走進(jìn)Linq-Linq to Objects(下)實例篇
走進(jìn)Linq-Linq to SQL感性認(rèn)識篇
走進(jìn)Linq-Linq to SQL How do I(1)
走進(jìn)Linq-Linq to SQL How do I(2)
走進(jìn)Linq-Linq to SQL How do I(3)
走進(jìn)Linq-How do I(4)拾遺補零篇第一節(jié)
走進(jìn)Linq-Linq to SQL源代碼賞析 Table
走進(jìn)Linq-Linq to SQL源代碼賞析之Provider的初始化
走進(jìn)Linq-Linq to SQL源代碼賞析,通過Linq to SQL看Linq
多對多的關(guān)系
Linq to SQL默認(rèn)是不支持多對多的關(guān)系的,所以也沒有針對多對多關(guān)系的Attribute和Query,不過網(wǎng)上有很多多對多關(guān)系的解決方案,在這里我就不做介紹了,我給個連接:
http://blogs.msdn.com/mitsu/archive/2007/06/21/how-to-implement-a-many-to-many-relationship-using-linq-to-sql.ASPx
這位大哥的方案是一個通用的,你可以下載他的代碼應(yīng)用到你的項目當(dāng)中,有時間我會把這個翻譯一下。
一對一的關(guān)系(one-to-one)
一對一的關(guān)系Linq to SQL是支持的,你只要給關(guān)系的兩邊都加上EntitySet屬性就可以了,下面用實例做個演示:
在我們的實例中,每個用戶對應(yīng)著一個博客,每個博客也只對應(yīng)著一個用戶,這是個一對一的關(guān)系:

it知識庫:走進(jìn)Linq-Linq to SQL How do I(2),轉(zhuǎn)載需保留來源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。