1. 程式人生 > 其它 >LINQ to SQL(3):增刪改查

LINQ to SQL(3):增刪改查

上一節中,我已經寫過了利用OR設計器生成物件模型的方式,其實生成這樣對資料庫進行對映的模型的方式不只這一種,不過VS為我們提供的這種設計器真的是很強大,在實際應用中也是經常用到的

這一節寫利用LINQ to SQL對資料庫進行的簡單增刪改查的操作的實現方式,這裡注意是“簡單”,複雜的查詢呢,我將會在下一篇或者下下一篇中寫到,那裡會有很多的內容,比如處理併發啦,自定義LINQ表示式查詢啦,等等的這些,而下一篇中我計劃寫一些關於擴充套件OR設計器生成的程式碼以及向實體類中新增驗證的一些東西,因為畢竟我們使用OR設計器生成程式碼的時候,還不夠靈活

好了,回到正題,我們還延續上一節的內容,假設我們已經把我們的dbml設計成了以下的這個樣子

這裡看到,我在OR檢視中添加了兩個有主外來鍵關係的表,一個檢視,和一個儲存過程,下面示範怎樣來執行增刪改查

查詢

首先我們假設要查詢Customers表中所有City為London的資料項

NorthWindDataContext dc = new NorthWindDataContext("Data Source=XIAOYAOJIAN;Initial Catalog=Northwind;Integrated Security=True");

            var customer = from c in dc.Customers
                           where c.City=="London"
                           select c;

            foreach (Customers c in customer)
            {
                Console.WriteLine(c.CustomerID + " | " + c.City);
            }

這個我才第一篇中應該也是寫過的,而且語言很簡單,因為我們已經完全不用管NorthWindDataContext 的內部到底是怎樣實現這個查詢的啦

然後,我們在Customers表裡新增一條資料,CustomerID為blogs,CompanyName為xiaoyaojian,City為London,當然小白現在沒有在倫敦啦,只是為了使用上面的程式碼,驗證一下我們的操作是否成功,其他欄位呢,因為都是允許為空,也沒有其他的約束,我就不寫啦

插入資料行

NorthWindDataContext dc = new NorthWindDataContext("Data Source=XIAOYAOJIAN;Initial Catalog=Northwind;Integrated Security=True");
            //宣告一個Customers的示例,這裡相當於資料表中的一行資料
            Customers insertCustomer = new Customers() { CustomerID = "blogs", CompanyName = "xiaoyaojian", City = "London" };
            dc.Customers.InsertOnSubmit(insertCustomer);//當提交更改時候插入insertCustomer到表Customers中
            dc.SubmitChanges();//提交更改
            var customer = from c in dc.Customers
                           where c.City=="London"
                           select c;

            foreach (Customers c in customer)
            {
                Console.WriteLine(c.CustomerID + " | " + c.City);
            }  

我們F5執行,會看到下面的效果

我們看到已經有CustomerID為blogs的資訊輸出啦,說明我們已經成功的插入了資料行

那麼,我們剛才插入的資料並不完整,我們要修改或者在這裡說,補充完整我們剛才插入的資料,就需要這麼幹啦

修改資料行

NorthWindDataContext dc = new NorthWindDataContext("Data Source=XIAOYAOJIAN;Initial Catalog=Northwind;Integrated Security=True");

            var query = from c in dc.Customers
                        where c.CustomerID == "blogs"
                        select c;
            //得到我們想要的資料行
            Customers blogsCustomer = query.First();
            blogsCustomer.Country = "Tianjin";//追加資訊
            blogsCustomer.CompanyName = "Xiaoyaojian";//追加資訊
            dc.SubmitChanges();//提交更改

            var queryCustomers = from c in dc.Customers
                                 where c.City == "London"
                                 select c;
            foreach (Customers cust in queryCustomers)
            {
                Console.WriteLine(cust.CustomerID+" | "+cust.CompanyName+" | "+cust.Country);
            }

F5,執行,我們可以看到如下結果

結果已經顯示出來啦,那麼現在這條資料呢,我們需要刪除,因為天津沒有倫敦這個地方,,,這叫什麼話,反正呢,假設我們現在需要刪除這條資料,怎麼做呢

刪除資料行

NorthWindDataContext dc = new NorthWindDataContext("Data Source=XIAOYAOJIAN;Initial Catalog=Northwind;Integrated Security=True");

            var xiaoyaojian = from c in dc.Customers
                              where c.CustomerID == "blogs"
                              select c;
            dc.Customers.DeleteOnSubmit(xiaoyaojian.First());//提交更改時,刪除這條資料
            dc.SubmitChanges();

            var queryCustomers = from c in dc.Customers
                                 where c.City == "London"
                                 select c;
            foreach (Customers cust in queryCustomers)
            {
                Console.WriteLine(cust.CustomerID+" | "+cust.CompanyName+" | "+cust.Country);
            }

執行,出結果

在輸出結果中,我們已經CustomerID為blogs的這條記錄啦

查詢檢視

查詢檢視呢,和查詢表是一樣的

 NorthWindDataContext dc = new NorthWindDataContext("Data Source=XIAOYAOJIAN;Initial Catalog=Northwind;Integrated Security=True");

            var query = from c in dc.Category_Sales_for_1997
                        select c;
            foreach (Category_Sales_for_1997 c in query)
            {
                Console.WriteLine(c.CategoryName + " | " + c.CategorySales);
            }

執行,出結果

絕對的雷同,不是巧合,當然了,訪問檢視的規則,還是必須要和資料庫中我們建立檢視的規則一樣的,能怎麼操作,不能怎麼操作,不是由LINQ to SQL決定的,OR設計器只是幫助我們生成了一個實體類對於檢視結果集的一個對映而已

呼叫儲存過程

OR設計器為我們生成了一個方法來呼叫儲存過程,當這個儲存過程有返回值的時候,OR設計器也會為我們生成一個數據實體的對映,下面演示一下呼叫方式

NorthWindDataContext dc = new NorthWindDataContext("Data Source=XIAOYAOJIAN;Initial Catalog=Northwind;Integrated Security=True");

            var query = dc.CustOrderHist("ALFKI");
            foreach (CustOrderHist_個結果 c in query)
            {
                Console.WriteLine(c.ProductName+" | "+c.Total);
            }
            Console.ReadKey();

執行,出結果

怎麼樣,簡單到不可思議吧,必要懷疑,不要以為LINQ to SQL是多麼高深的話題,完全沒有,但是,中國話呀,就是這樣,一說“但是”就要麻煩啦,沒錯,在我們享受它的方便快捷的同時,也會經常遇到這樣那樣的問題,併發處理,怎樣支援事務,事務回滾,解決各種各樣的衝突,這些我計劃會才下下一篇中詳細寫到,也未必全面,只是會寫一些我遇到的或者知道的,在實際應用中,就要靠大家經驗的積累啦