該系列教程描述了如何采用手動的方式映射你的對象類到數(shù)據(jù)表(而不是使用象SqlMetal這樣的自動化工具)以便能夠支持?jǐn)?shù)據(jù)表之間的M:M關(guān)系和使用實體類的數(shù)據(jù)綁定。即使你選擇使用了自動生成類的工具,理解這一實現(xiàn)過程可以讓你更加方便地對你的應(yīng)用程序加以擴展。
第一篇:步步學(xué)LINQ to SQL:將類映射到數(shù)據(jù)庫表
一旦你將數(shù)據(jù)庫表映射到對應(yīng)的類對象上并在DataContext中申明了到數(shù)據(jù)庫的映射關(guān)系,你就可以不需要使用一行數(shù)據(jù)庫代碼(SQL語句)訪問數(shù)據(jù)了。
通過一個簡單的示例BookCatalog(強類型的DataContext)來說明,你可以通過使用在Authors,Books和 Categories中定義的集合從數(shù)據(jù)庫中訪問book,author和category。

例如,要查找書的類別,你所要做的就是循還bookCatalog.Books對象并且LINQ會自動地查找數(shù)據(jù)庫(通過映射關(guān)系)并填充你使用的集合---使用Book類為要查找的每本書創(chuàng)建一個實例:
BookCatalog bookCatalog = new BookCatalog( ); foreach( Book book in bookCatalog.Books){ string title = book.Title; decimal price = book.Price; } |
你也可以使用LINQ來過濾這些結(jié)果集,因為大多數(shù)時候,你并不要一次返回所有的書或者基于性能方面的考慮也不會這么做。
LINQ提供了一套完整的類似于SQL語法的語言,該語言已經(jīng)被集成到了.NET語言(C#,Visual Basic)。對該語法的描述超出了本文的范圍,下面我們一起看兩個例子以了解它們是如何使用的。
因為BookCatalog返回一個集合對象,我們使用的查詢語法將會查找這些對象(意味著你將直接使用對象名以及它們包涵的字段或?qū)傩远皇菙?shù)據(jù)表的字段)。因此,例如,如果你僅僅想查找價格低于$30的書籍,你可以使用一個LINQ where從句,該從句可以僅僅只從bookCatalog.Books集合對象上查找價格低于$30的書:
IEnumerable cheapBooks = from book in bookCatalog.Books where book.Price.CompareTo( 30m ) < 0 select book; |
LINQ的延期執(zhí)行意味著對books集合的檢索不會即時從數(shù)據(jù)庫取得直到實際需要時才進行(例如,使用一個foreach循還),因此我們可以保持應(yīng)用的過濾條件,然后限制查詢的數(shù)據(jù)以確保讀取數(shù)據(jù)的效率。
例如,你以后可以使用LINQ提供的orderby語法來定義上面的結(jié)果集將數(shù)據(jù)按書的標(biāo)題進行排序。
IEnumerable sortedBooks = from book in cheapBooks orderby book.Title select book; |
現(xiàn)在,如果你在執(zhí)行了LINQ查詢鏈之后通過sortedBooks執(zhí)行循還,僅僅只會執(zhí)行一次數(shù)據(jù)庫查詢。其結(jié)果仍然會返回價格低于$30并且按照書的標(biāo)題排序的所有書。
BookCatalog bookCatalog = new BookCatalog( ); IEnumerable cheapBooks = from book in bookCatalog.Books where book.Price.CompareTo( 30m ) < 0 select book; IEnumerable sortedBooks = from book in cheapBooks orderby book.Title select book; foreach( Book book in sortedBooks ) { ... } |
現(xiàn)在我們一起看看如何映射對象之間的關(guān)系以便你能夠操作這些對象(例如book.Author.Name)。