2010-09-06 74 views
3

兩個態,我有兩個Repeater控件如何把在lambda表達式

var list = from i in DA.obm_view_studentLists where i.FranchiseID == FranchiseID && i.ExamDate == DateTime.Parse(this.pallavi.DropDownSelectedValue) select i; 

我想導致從數據庫中1分走。

this._approvedStudentList.DataSource = list.Select(e => e.ApprovedByOBM == true); 

this._pendingStudentList.DataSource = list.Select(e => e.ApprovedByOBM == false); 

我在pendingStudentList中繼器的標籤字段(UnPaidTotal),我想顯示總費用待定

我試過,但失敗

UnPaidTotal = string.Format("{0:c}", list.Select(e => e.ApprovedByOBM == true).Sum(j => j.CourseFee)); 
+0

你得到的錯誤信息是什麼? – 2010-09-06 01:37:53

+0

我想你想要一個.Where()不是一個.Select()然後你可以&&條件一起.Where(p => p.x == a && p.y == b) – Robaticus 2010-09-06 02:33:37

回答

2

評估list得到的所有結果一個鏡頭 - 只需在括號中包裝from i in… select i,並在最後添加.ToList()

當設置DataSource,獲得無償總時list.Where(…

同樣的事情更換list.Select(… - 使用Where代替Select


您不需要從數據庫返回兩個集合,因爲您要根據布爾值劃分結果。你想要所有的查詢結果,因爲不管每個結果屬於哪一個集合或另一個集合,所以你可以將它們拆分到內存中。

Select用於對集合執行轉換,而Where是一個過濾器。選擇的一個例子是manufacturerList = carCollection.Select(car => car.Manufacturer);。這需要汽車的集合,並通過從集合的每個成員中僅選擇該屬性將其轉換爲製造商的枚舉。

1

這裏的關鍵是,在你爲列表變量創建查詢的第一行代碼之後,你還沒有出去到數據庫。你所做的只是創建一個IEnumerable/IQueryable,它知道如何去數據庫並獲取你的數據。除非將其綁定到控件或以其他方式嘗試對結果進行迭代,否則不會發生任何反應。

您的問題是,當您最終綁定到第一個控件時,該IEnumerable的狀態會發生變化,因此它現在指向結果集的結尾,而不是等待在開始時打開數據庫。當您嘗試綁定第二個轉發器時,那裏沒有記錄。

解決這個問題的最簡單方法是將原始查詢結果放在列表中,但應該知道這會導致您的Web服務器將整個結果集加載到RAM中。另一個選擇是使用一箇中繼器,對查詢進行適當排序,並使用代碼輸出所需的html,具體取決於您擁有哪種類型的行以及部分之間的額外html。這樣做會更好,但會跨越不同層次之間的界限。