【问题标题】:How to put two condition in lambda expression如何在 lambda 表达式中放置两个条件
【发布时间】:2011-04-08 14:13:43
【问题描述】:

我有两个中继器控件

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

我在 pendingStudentList 中继器中有一个标签字段 (UnPaidTotal),我想在其中显示待处理的总费用

我试过但失败了

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

【问题讨论】:

  • 您收到的错误信息是什么?
  • 我认为你想要一个 .Where() 而不是一个 .Select() 然后你可以把 && 条件放在一起 .Where(p=>px == a && py == b)

标签: c# linq language-features


【解决方案1】:

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

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

获得未付总额时也是如此——使用Where 而不是Select


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

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

【讨论】:

    【解决方案2】:

    这里的关键是,在您为列表变量创建查询的第一行代码之后,您还没有进入数据库。您所做的只是创建一个 IEnumerable/IQueryable,它知道如何访问数据库并获取数据。在您实际将其绑定到控件或尝试迭代结果之前,什么都不会发生。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-28
      • 2020-06-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多