【问题标题】:Return certain record based on criteria根据条件返回特定记录
【发布时间】:2017-03-29 16:26:35
【问题描述】:

获取此结果列表

  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") 返回第三条记录。

感谢您的帮助。

【问题讨论】:

  • 必须是Linq吗?使用foreach 循环,您可以一次性轻松完成。
  • 抱歉,没有迭代,因为实际查询将超过数千条记录
  • 排序为 yesorno 然后得到第一个 yes,有什么问题?
  • 那么我认为你需要两次通行证 - 一个找到最高的“NO”日期,一个找到该日期之后最早的“YES”值。或者使用直接 SQL 查询。
  • @AlessandroD'Andria 这正是我不想做的。这将如何给我 2007 年的记录?

标签: c# sql linq


【解决方案1】:

您可以通过降序并取第一组“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”后面没有“YES”,则返回null

【讨论】:

  • @RyanSearle 我确信它可以编译,但我也确信你在执行它时会遇到异常。至少我无法想象生成的 SQL 应该是什么样子,但我错过了过去十年对 SQL 的一些改进......
  • @RenéVogt 我也对 TakeWhile 感到惊讶。但是 afaik LastOrDefault 仍然不适用于 EF
  • @RenéVogt 谢谢,这肯定有帮助。然而,我错过了我的问题中的一个重要部分。跟进stackoverflow.com/questions/43114138/…
【解决方案2】:
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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-02
    • 2021-07-25
    • 1970-01-01
    • 2022-09-23
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    相关资源
    最近更新 更多