先看看下面这段代码
01 var context = GenerateContext();
02 context.Log = Console.Out;
03
04 // 查询publisher对象
05 Console.WriteLine("Querying publisher");
06 Publisher publisher = context.Publishers.Where(
07 p => p.PublisherID == new Guid("ae825c5f-465d-4eb5-a2bb-cc1aeb5edb7d")).Single();
08
09 Console.WriteLine("Querying books")
10 // 当调用publisher.Books.GetEnumerator()时,执行book对象的查询
11 foreach (Book book in publisher.Books)
12 {
13 Console.WriteLine(book.Title);
14 }
在默认情况下,DataContext并不会加载Assocation对象(EntitySet<T> 或EntityRef<T>),当Assocation对象需要被访问时才会执行数据库查询,这就是所谓的lazy-loading。 LINQ2SQL的Layz-loading的实现与IEnumerable<T>的deferred query execution是一样的,有兴趣可以看看EntitySet<T>.GetEnumerator或 EntityRef<T>.Entity.Getter代码。
Lazy-loading的好处是避免了不必要的查询,但是在某些场合确定Assocation对象都应该加载时,我们可以设置DataContext. LoadOption来指定Assocation对象的加载:
1 DataLoadOptions option = new DataLoadOptions();
2 option.LoadWith<Publisher>(p => p.Books);
3 context.LoadOptions = option;
总结:本节讨论了如何使用LINQ2SQL来进行简单对象和涉及Association的对象的CRUD操作。示例代码段在只涉及一个DataContext对象或在单线程的情况下都可以正确运行,但是当涉及多个DataContext或并发访问的情况的下会怎么样呢?这是我们接下来要讨论的。