如何在lambda表达式中放入两个条件

时间:2010-09-06 01:29:30

标签: c# linq language-features

我有两个Repeater Control

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));

2 个答案:

答案 0 :(得分:2)

评估list一次性获取所有结果 - 只需将from i in… select i括在括号中,然后在末尾添加.ToList()

设置DataSource时,将list.Select(…替换为list.Where(…

获得未支付的总数时使用Where代替Select


您不需要从数据库返回两个集合,因为您要根据布尔值划分结果。您需要所有的查询结果,因为无论每个结果属于一个集合还是另一个集合,您都可以将它们分解为内存。

Select用于对集合执行转换,而Where是过滤器。选择的示例是manufacturerList = carCollection.Select(car => car.Manufacturer);。这需要一组汽车,并通过从集合的每个成员中选择该属性,将其转换为可枚举的制造商。

答案 1 :(得分:1)

这里的关键是,在为列表变量创建查询的第一行代码之后,您尚未进入数据库。您所做的就是创建一个知道如何访问数据库并获取数据的IEnumerable / IQueryable。在您将其实际绑定到控件或以其他方式尝试迭代结果之前,没有任何事情发生。

您的问题是,当您最终绑定到第一个控件时,该IEnumerable的状态发生更改,现在它指向结果集的末尾,而不是等待在开头打开数据库。当您尝试绑定第二个转发器时,那里没有记录。

解决此问题的最简单方法是简单地将原始查询结果放在列表中,但您应该知道这会导致Web服务器将整个结果集加载到RAM中。另一种选择是使用一个转发器,适当地命令查询并使用代码输出所需的html,具体取决于您拥有的行类型和部分之间的额外html。这样做会更好,但会在不同层之间穿过。