【发布时间】:2017-03-30 09:45:37
【问题描述】:
我之前问过这个问题,但错过了我问题的一个重要部分。
Return certain record based on criteria
获取此结果列表
Client | Date | YESorNO
-------------------------------
A1 | 01/01/2001 | NO
A1 | 01/01/2002 | NO
A1 | 01/01/2003 | YES
A1 | 01/01/2004 | NO
A1 | 01/01/2005 | NO
A1 | 01/01/2006 | NO
A1 | 01/01/2007 | YES
A1 | 01/01/2008 | YES
A1 | 01/01/2009 | YES
A2 | 01/01/2001 | NO
A2 | 01/01/2002 | NO
A2 | 01/01/2003 | YES
A2 | 01/01/2004 | NO
A2 | 01/01/2005 | YES
A2 | 01/01/2006 | YES
A3 | 01/01/2001 | NO
...etc...
列表是按时间顺序排列的,除了降序/升序之外,我无法以任何其他方式排序。
我无法排序是 |否并找到 First() 或 Last() 因为这不会给我所需的值。
我希望能够在每个客户的所有“否”都被考虑后返回第一个“是”。
在上面的 Client[A1] 示例中,第 7 行是我想要返回的记录(2007 年 1 月 1 日)。
客户[A2] - 第 5 行 (01/01/2005) ..etc
我的代码如下
var query =
(
from m in db.MyTable
where m.Criteria == XYZ
select new
{
Client = m.Client,
Date = m.Date,
YESorNO = m.YESorNO
}
).OrderBy(x => x.Date);
使用.FirstOrDefault(x => x.YesOrNO == "YES") 返回第三条记录。
用户@RenéVogt 建议
var result = query.AsEnumerable()
.TakeWhile(x => x.YESorNO == "YES")
.LastOrDefault();
会完成这项工作,但我忘了补充一点,查询将返回许多客户,我需要为每个客户提供第一个“是”,因此上面的代码是不够的。
迭代我的结果将非常耗时,虽然这是一种解决方案,但我希望此逻辑位于数据库查询本身中(如果可能)
非常感谢
【问题讨论】:
-
您可以在 2 个查询中轻松完成。获取每个客户的所有“否”列表......只为每个客户选择最后一个否。然后使用它来要求按日期列出最后一个“NO”之后的第一个“YES”列表。