LINQ to SQL 系列 如何使用LINQ to SQL插入、修改、刪除數據

LINQ和 LINQ to SQL 都已經不是一個新事物了,但是我接觸的比較晚,本着絕知此事要躬行的態度,決定寫這個系列。

 

本文使用的測試環境是VS 2010,和sql server 2005數據庫。

 

1.  從CUD開始,如何使用LINQ  to SQL插入、修改、刪除數據

2.  查詢 使用LINQ to SQL做簡單查詢

3.  查詢 延遲加載與立即加載,使用LoadWith和AssociateWith

4.  查詢 inner join,left outer join

5.  Linq to SQL中的聚合

6.  LINQ to SQL查詢優化,需要憂慮性能嗎?

 

第一篇       從CUD開始,如何使用LINQ  to SQL插入、修改、刪除數據 

準備工作,現在數據庫中建好測試表Student,這個表只有三個字段ID,Name,Hometown,其中ID爲int類型的自增長字段,Name和Howmtown是nvarchar類型

1. 打開VS2010新建控制檯應用程序,然後添加LINQ to SQL Class,命名爲DbApp.dbml,新建dbml文件之後,可以打開server explorer,建立數據庫連接,並將我們新建的表拖到dbml文件中,結果如下圖

 

2. 可以通過點擊dbml文件空白處,按F4顯示dbml屬性,可以修改Context和生成實體的命名空間

 

3. 到現在爲止VS2010通過工具爲我們創建好了數據表對應實體類和數據表操作添,改,刪的方法,現在開始實踐

1) 添加 Add

01 static void Add()
02 {
03     //添加一個Student
04     Student aStudent = new Student
05     {
06         Name = "張小二",
07         Hometown = "南海觀音院"
08     };
09     Console.WriteLine("----------begin Add a student");
10     using (DbAppDataContext db = new DbAppDataContext())
11     {
12         db.Log = Console.Out;
13         db.Students.InsertOnSubmit(aStudent);
14         db.SubmitChanges();
15     }
16   
17     Console.WriteLine("----------End Add a student");
18 }

輸出的sql語句 

1 INSERT INTO [dbo].[Student]([Name], [Hometown])
2 VALUES (@p0, @p1)
3   
4 SELECT CONVERT(Int,SCOPE_IDENTITY()) AS [value]
5 -- @p0: Input NVarChar (Size = 4000; Prec = 0; Scale = 0) [張小二]
6 -- @p1: Input NVarChar (Size = 4000; Prec = 0; Scale = 0) [南海觀音院]
7 -- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 4.0.30319.1

2) 使用linq to sql執行Edit 編輯操作

01 private static void Edit(int id)
02 {
03     Console.WriteLine("----------begin edit");
04     using (DbAppDataContext db = new DbAppDataContext())
05     {
06         db.Log = Console.Out;
07   
08     //取出student
09     var editStudent = db.Students.SingleOrDefault<Student>(s=>s.ID == id);
10   
11     if (editStudent == null)
12     {
13         Console.WriteLine("id錯誤");
14         return;
15     }
16   
17     //修改student的屬性
18     editStudent.Name = "張小三";
19     editStudent.Hometown = "張家口張家寨張家營";
20   
21     //執行更新操作
22     db.SubmitChanges();
23   
24     }
25     Console.WriteLine("---------end edit Student");
26 }
1 輸出的sql語句
01 <PRE class=brush:sql>SELECT [t0].[ID], [t0].[Name], [t0].[Hometown]
02 FROM [dbo].[Student] AS [t0]
03 WHERE [t0].[ID] = @p0
04 -- @p0: Input Int (Size = -1; Prec = 0; Scale = 0) [6]
05 -- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 4.0.30319.1
06   
07 UPDATE [dbo].[Student]
08 SET [Name] = @p3, [Hometown] = @p4
09 WHERE ([ID] = @p0) AND ([Name] = @p1) AND ([Hometown] = @p2)
10 -- @p0: Input Int (Size = -1; Prec = 0; Scale = 0) [6]
11 -- @p1: Input NVarChar (Size = 4000; Prec = 0; Scale = 0) [張小二]
12 -- @p2: Input NVarChar (Size = 4000; Prec = 0; Scale = 0) [南海觀音院]
13 -- @p3: Input NVarChar (Size = 4000; Prec = 0; Scale = 0) [張小三]
14 -- @p4: Input NVarChar (Size = 4000; Prec = 0; Scale = 0) [張家口張家寨張家營]
15 -- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 4.0.30319.1
16 </PRE>

3)使用linq to sql 執行刪除操作

執行代碼:

01 static void Delete(int id)
02 {
03     Console.WriteLine("-----------begin delete a student");
04     using (DbAppDataContext db = new DbAppDataContext())
05     {
06         db.Log = Console.Out;
07         //取出student
08         var student = db.Students.SingleOrDefault<Student>(s => s.ID == id);
09   
10         if (student == null)
11         {
12             Console.WriteLine("student is null");
13             return;
14         }
15   
16         db.Students.DeleteOnSubmit(student);
17   
18         db.SubmitChanges();
19     }
20     Console.WriteLine("------------end Delete student");
21 }

生成的sql語句:

01 SELECT [t0].[ID], [t0].[Name], [t0].[Hometown]
02 FROM [dbo].[Student] AS [t0]
03 WHERE [t0].[ID] = @p0
04 -- @p0: Input Int (Size = -1; Prec = 0; Scale = 0) [6]
05 -- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 4.0.30319.1
06   
07 DELETE FROM [dbo].[Student] WHERE ([ID] = @p0) AND ([Name] = @p1) AND ([Hometown
08 ] = @p2)
09 -- @p0: Input Int (Size = -1; Prec = 0; Scale = 0) [6]
10 -- @p1: Input NVarChar (Size = 4000; Prec = 0; Scale = 0) [張小三]
11 -- @p2: Input NVarChar (Size = 4000; Prec = 0; Scale = 0) [張家口張家寨張家營]
12 -- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 4.0.30319.1

總結:通過以上實踐可以看到使用linq to sql執行增改刪操作,非常方便,我們甚至不需要學習任何sql相關的知識。

 我有兩點疑惑,請各位指點:

1.  是否是在執行update和delete時必須先獲得實體,然後才能執行操作,我嘗試在update時,不去數據庫中獲取實體,而是自己聲明一個實體,然後去刪除,但是失敗了

2.  在生成的update和delete的條件語句中包含name=@p和hometown=@p的語句,按理說link to sql已經知道id是唯一的主鍵,爲什麼還會傳這些沒有的條件進去的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章