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