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

3

我有两个 Repeater 控件

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

我希望能够从数据库中一次性获取结果。

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

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

我有一个Label字段(UnPaidTotal)在pendingStudentList重复器中,我想显示总费用待支付

我尝试过但失败了

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

你收到了什么错误信息? - Leniel Maccaferri
我认为你想要一个.Where()而不是.Select(),然后你可以将条件用&&连接起来。.Where(p=>p.x == a && p.y == b) - Robaticus
2个回答

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。这将表现更好,但跨越了不同层之间的线条。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接