根据标准返回某些记录

时间:2017-03-29 16:26:35

标签: c# sql linq

获取此结果列表

  Date     | YESorNO
---------------------
01/01/2001 | NO
01/01/2002 | NO
01/01/2003 | YES
01/01/2004 | NO
01/01/2005 | NO
01/01/2006 | NO
01/01/2007 | YES
01/01/2008 | YES
01/01/2009 | YES

列表是有序的,除了降序/升序之外,我无法对其进行排序。

我希望能够在所有'NO'被记录之后返回第一个'YES'。

在上面的例子中,第7行是我要返回的记录(2007年1月1日)

我的代码如下

var query = 
(
    from m in db.MyTable
    where m.Criteria == XYZ
    select new
    {
      Date = m.Date, 
      YESorNO = m.YESorNO
    }
).OrderBy(x => x.Date);

使用.FirstOrDefault(x => x.YesOrNO == "YES")返回第3条记录。

感谢您的帮助。

2 个答案:

答案 0 :(得分:5)

您可以通过下订单来完成此操作并获取第一组" YES"的最后一个元素:

var query = 
(
    from m in db.MyTable
    where m.Criteria == XYZ
    select new
    {
      Date = m.Date, 
      YESorNO = m.YESorNO
    }
).OrderByDescending(x => x.Date);

var result = query.AsEnumerable()
                  .TakeWhile(x => x.YESorNO == "YES")
                  .LastOrDefault();

我在这里使用AsEnumerable(),因为我不确定哪些运算符可以转换为SQL,TakeWhile肯定不会。

如果没有"是"在最新的" NO"之后,这将返回null

答案 1 :(得分:0)

var query = db.MyTable
    .Where(m.Criteria == XYZ)
    .Select(e => new { Date = e.Date, YESorNO = e.YESorNO })
    .OrderBy(e => x.Date);

var latestNODate = query.Where(ee => ee.YESorNO == "NO").Last().Date;
var element = query.Where(e => e.Date > latestNODate && e.YESorNO == "YES").FirstOrDefault();