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

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