Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 根据条件返回特定记录_C#_Sql_Linq - Fatal编程技术网

C# 根据条件返回特定记录

C# 根据条件返回特定记录,c#,sql,linq,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 列表已排序,我无法排序这是降序/升序以外的任何其他方式 我希望在所有的“否”都被解释之后,能够返

以这个结果列表为例

  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
列表已排序,我无法排序这是降序/升序以外的任何其他方式

我希望在所有的“否”都被解释之后,能够返回第一个“是”

在上面的示例中,第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”)
返回第三条记录


感谢您的帮助。

您可以通过按降序排列并选择第一组“是”的最后一个元素来完成此操作:

我在这里使用
AsEnumerable()
,因为我不确定哪些操作符可以翻译成SQL,
TakeWhile
肯定不能



如果在最新的“否”之后没有“是”,则返回
null

您可以通过降序并取第一组“是”的最后一个元素来执行此操作:

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();
我在这里使用
AsEnumerable()
,因为我不确定哪些操作符可以翻译成SQL,
TakeWhile
肯定不能



如果在最新的“否”之后没有“是”,则返回
null

是否必须为Linq?使用
foreach
循环,您可以在一次过程中轻松完成此操作。抱歉,是的,没有迭代,因为实际查询将超过数千条记录。对于yesorno,然后获得第一个yes,有什么问题?然后我想您需要两次过程-一次找到最高的“no”日期,另一次找到该日期后最早的“yes”值。或者使用直接SQL查询。@AlessandroD'Andria这正是我不想做的。那会给我2007年的记录吗?一定是林克吗?使用
foreach
循环,您可以在一次过程中轻松完成此操作。抱歉,是的,没有迭代,因为实际查询将超过数千条记录。对于yesorno,然后获得第一个yes,有什么问题?然后我想您需要两次过程-一次找到最高的“no”日期,另一次找到该日期后最早的“yes”值。或者使用直接SQL查询。@AlessandroD'Andria这正是我不想做的。这将如何为我提供2007年的记录?@RyanSearle我肯定它可以编译,但我也肯定你在执行它时会遇到异常。至少我无法想象得到的SQL应该是什么样子,但我错过了过去十年SQL的一些改进…@RenéVogt我对TakeWhile也感到惊讶。但afaik LastOrDefault仍然无法与EF@Ren谢谢你,这确实有所帮助。然而,我遗漏了问题中的一个重要部分。Follow@RyanSearle我肯定它会编译,但我也肯定在执行它时会出现异常。至少我无法想象得到的SQL应该是什么样子,但我错过了过去十年SQL的一些改进…@RenéVogt我对TakeWhile也感到惊讶。但afaik LastOrDefault仍然无法与EF@Ren谢谢你,这确实有所帮助。然而,我遗漏了问题中的一个重要部分。跟进
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();