LINQ查詢探討:一個主從報表和數據統計
在LINQ 查詢中,始終會用到對象。可以使用相同的基本編碼模式來查詢和轉換 XML 文檔、SQL 數據庫、ADO.NET 數據集、.NET 集合中的數據以及對其LINQ 提供程序可用的任何其他格式的數據。
以前,我們要在某個報表中顯示統計信息一般有兩種方法:1通過一個SQL查詢——我們可以向數據庫發出一個額外的查詢來為某個特定的類別計算統計信息。SQL包含一系列的聚合函數,并由GROUP BY子句指定應該根據什么數據來進行統計。2在表示層中統計已經獲取的信息。
然而這兩個方法都有他們的缺點:
第一種方法很明顯,他增加了一次到數據庫的往返,因為在獲取報表信息的時候我們已經對數據庫進行了一次訪問,而我們要獲得的統計信息可以從報表中獲取。而且無法獲取更加復雜的業務統計。
第二種方法則沒有很好的讓層次劃分出來,我們更加希望表示層中僅僅使用方法而不要去設計這些方法。(尤其是一些業務規則,比如NBA中有“球員效率”這項數據,但如果不是很熟悉這項業務的程序員是不知道這個效率是如何計算的。)
既然我們使用了分層架構,就應該把這些職能分開,表示層的設計者只需要設計UI,了解方法的名稱就可以了。具體的業務計算應該留下來給業務邏輯層的設計者去設計。
有了LINQ查詢我們就可以把這些東西都放到業務層去了,因為數據操作已經對象化,在邏輯層中就可以方便地統計數據并且直接在表示層調用這樣的方法。
按部就班的做
1我們需要一個下來列表來選擇門類,所以我們需要一個門類列表,在Productbll中添加一個新的方法GetCategory代碼如下:
- [System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Select, true)]
- public IQueryable GetCategory()
- {
- var category = from p in db.Categories
- select p;
- return category;
- }
2.代碼很簡單我就不解釋了,由于我們的重點不是這個門類選擇列表,所以我直接選擇了全部字段,其實只要ID和Name兩個字段就可以了。新建一個WEB窗體,添加一個下拉列表,在自動回送上打勾,選擇新建數據源。
3.LINQ查詢下數據源選擇對象數據源,選擇Productbll,方法選擇GetCategory,點擊完成。字段顯示填寫CategoryName,字段值填寫CategoryID。
4.然后就是顯示統計和從報表的方法,在GetCategory方法下添加一個新方法GetProductByCategoryID,代碼如下:
- [System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Select, true)]
- public IQueryable GetProductByCategoryID(int categoryID,out decimal? total)
- {
- total = 0;
- var product = from p in db.Products
- where p.CategoryID == categoryID
- select p;
- foreach (Product p in product)
- total += p.UnitPrice;
- return product;
- }
5.簡單的代碼解釋:
1)這是一個包含2個輸出的方法,方法本身是可以作為數據源的IQueryable類型,另外還會輸出一個十進制類型數,也就是總價
2)獲取CategoryID與輸入參數categoryID相匹配的記錄
3)遍歷這些記錄,獲取他們的價格之和
4)返回這些記錄與總價
6.在頁面中添加一個GridView與一個Lable控件,雙擊下拉列表,進入事件,加入如下代碼:
- decimal? sum = 0;
- GridView1.DataSource=product.GetProductByCategoryID(Convert.ToInt16(DropDownList1.SelectedValue),out sum);
- GridView1.DataBind();
- Label1.Text = "總價:"+Convert.ToString(sum);
7.運行該頁面,任意選擇一個門類,觀察總價和這些記錄。
小結:
這章的內容并不多,需要注意的是我們使用了返回多個結果的方法,方法本身是IQueryable類型,另外還會輸出一個十進制類型數,也就是總價。我們在邏輯層中利用LINQ查詢結果,并且進行遍歷,獲得總價。在表示層中我們僅僅調用了方法,而且對數據庫僅有一次操作。
比起直接用SQL獲取總價來說,我們的方法少了一次數據庫的往返。比起在表示層寫方法,我們的方法的層次更加分明。在沒有使用這樣的結構以前,也可以在邏輯層這么做,只不過還需要手動的把數據轉換成可以遍歷的對象,而現在一切都方便了。可以直接對Product表中的記錄使用for each.除此之外我們不需要做更多的工作。
本貼來自天極網群樂社區
【編輯推薦】