JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » .Net Framework » MS Framework (WPF,WCF,LINQ)  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友    訂閱主題
reply to postflat modego to previous topicgo to next topic
本主題所含的標籤
無標籤
作者 [LINQ] Linq to SQL之查询和添加
ray_linn

什么都不懂的小白

版主

發文: 540
積分: 10
於 2007-07-31 14:35 user profilesend a private message to usersend email to ray_linnreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
我们以Microsoft的例子Northwind数据库中的Customers和Orders表来说明Linq to SQL的查询和添加是怎样操作的。

对于Entity class的生成不再赘述,可以通过Visual Studio里的wizard声称或者自己手工定义。

创建一个Customer对象,然后把该数据添加到数据库中去。
1
2
3
4
5
6
NorthwindDataContext ctx = new NorthwindDataContext();
Customer c = new Customer { CustomerID = "Test1",
      CompanyName = "Test Company1" };
ctx.Customers.Add(c);
ctx.SubmitChanges();


运行这段代码,在sql profile中可以看到
1
  exec sp_executesql N'INSERT INTO [dbo].[Customers]([CustomerID], [CompanyName], [ContactName]...


这条sql语句,说明数据插入到Customer表中。然后再运行下面这段代码,看看能不能把刚才添加的数据从数据库中查询出来

1
2
3
Customer c1 = ctx.Customers.Single(c => c.CustomerID == "Test1");
Console.WriteLine(c1.CustomerID + "  " + c1.CompanyName);


运行这段代码后,在sql profile中可以看到执行了这条sql语句
1
  exec sp_executesql N'SELECT [t0].[CustomerID], [t0].[CompanyName], [t0].[ContactName]...


现在让下面的代码一次执行看看会发生什么?

1
2
3
4
5
6
7
8
9
10
  NorthwindDataContext ctx = new NorthwindDataContext();
  Customer c = new Customer
  {
      CustomerID = "Test2",
      CompanyName = "Test Company2"
  };
  ctx.Customers.Add(c);
  ctx.SubmitChanges();
  Customer c1 = ctx.Customers.Single(ct => ct.CustomerID == "Test2");
  Console.WriteLine(c1.CustomerID + "  " + c1.CompanyName);


通过sql profile中的记录,可以发现这次只执行了插入语句而没有执行查询语句,但是查询又的确返回了正确的结果。

根据Mtauly在microsoft的video里说这是Linq to SQL的一种Cache机制,称为Identity Cache。执行查询的时候,如果datacontext发现查询条件是主键而且只有主键的时候,它会先在Cache中查找,如果找到了就返回该对象,可以猜想在datacontext内部,可能用一个hashtable类似的容易,以主键的值为key来缓存操作过的对象。 而当我们用另一个datacontext进行查询或者查询条件不只包含主键的时候,它会进行一次对数据库的查询。

下面来看看Linq to SQL怎样进行一对多关系的查询。其实很简单:
1
2
3
4
5
  Customer c = ctx.Customers.Single(ct => ct.CompanyName == "Test Company1");
  foreach (var order in c.Orders)
  {
      Console.WriteLine(order);
  }


通过观察sql profile,发现只有使用c.Orders,才会对orders表进行查询,而在查询customer的时候不会把与之相关的Orders全部返回,这类似与Hibernate里面的lazy initialization机制吧。

再者,Linq to SQL里面提供了一种称为Delay Loaded机制,在字段上使用。意思是只有当使用这些字段的时候,才进行一次数据库查询把这些字段选取出来提供使用,对于包含大数据字段(picture、blob)数据的表,该机制也能提高不少效率。这是LINQ亮点之一。


reply to postreply to post
飞翔的候鸟
話題樹型展開
人氣 標題 作者 字數 發文時間
2595 [LINQ] Linq to SQL之查询和添加 ray_linn 2068 2007-07-31 14:35
» JWorld@TW »  .Net Framework » MS Framework (WPF,WCF,LINQ)

reply to postflat modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8