新聞中心
在LINQ 查詢中,始終會用到對象??梢允褂孟嗤幕揪幋a模式來查詢和轉換 XML 文檔、SQL 數據庫、ADO.NET 數據集、.NET 集合中的數據以及對其LINQ 提供程序可用的任何其他格式的數據。

讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領域值得信任、有價值的長期合作伙伴,公司提供的服務項目有:主機域名、虛擬空間、營銷軟件、網站建設、寶豐網站維護、網站推廣。
以前,我們要在某個報表中顯示統(tǒng)計信息一般有兩種方法:1通過一個SQL查詢——我們可以向數據庫發(fā)出一個額外的查詢來為某個特定的類別計算統(tǒng)計信息。SQL包含一系列的聚合函數,并由GROUP BY子句指定應該根據什么數據來進行統(tǒng)計。2在表示層中統(tǒng)計已經獲取的信息。
然而這兩個方法都有他們的缺點:
第一種方法很明顯,他增加了一次到數據庫的往返,因為在獲取報表信息的時候我們已經對數據庫進行了一次訪問,而我們要獲得的統(tǒng)計信息可以從報表中獲取。而且無法獲取更加復雜的業(yè)務統(tǒng)計。
第二種方法則沒有很好的讓層次劃分出來,我們更加希望表示層中僅僅使用方法而不要去設計這些方法。(尤其是一些業(yè)務規(guī)則,比如NBA中有“球員效率”這項數據,但如果不是很熟悉這項業(yè)務的程序員是不知道這個效率是如何計算的。)
既然我們使用了分層架構,就應該把這些職能分開,表示層的設計者只需要設計UI,了解方法的名稱就可以了。具體的業(yè)務計算應該留下來給業(yè)務邏輯層的設計者去設計。
有了LINQ查詢我們就可以把這些東西都放到業(yè)務層去了,因為數據操作已經對象化,在邏輯層中就可以方便地統(tǒng)計數據并且直接在表示層調用這樣的方法。
按部就班的做
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.然后就是顯示統(tǒng)計和從報表的方法,在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獲取總價來說,我們的方法少了一次數據庫的往返。比起在表示層寫方法,我們的方法的層次更加分明。在沒有使用這樣的結構以前,也可以在邏輯層這么做,只不過還需要手動的把數據轉換成可以遍歷的對象,而現在一切都方便了??梢灾苯訉roduct表中的記錄使用for each.除此之外我們不需要做更多的工作。
本貼來自天極網群樂社區(qū)
標題名稱:LINQ查詢探討:一個主從報表和數據統(tǒng)計
網站鏈接:http://m.5511xx.com/article/dpodggo.html


咨詢
建站咨詢
