【问题标题】:How can I convert my SQL command to a lambda expression?如何将我的 SQL 命令转换为 lambda 表达式?
【发布时间】:2014-03-03 10:31:58
【问题描述】:

我有这样的 SQL 查询:

  select top 1 Newsletter_HTML_Tag  from Newsletter_TBL
     where (Newsletter_Category_ID=1)
     order by Creation_Date desc

我还有一个方法,它给我来自Newsletter_TBL的所有记录的列表,命名为:

NewsletterGellAll()

我之前也试过了,还是不行:

NewsletterGellAll()
   .FirstOrDefault(c => c.NEWSLETTER_CATEGORY_ID == 1)
   .orderby(a => a.Creation_Date)

我该如何解决?

【问题讨论】:

  • “它不起作用”毫无意义。
  • 是 GetAllNewsLetter() 还是 NewsLetterGetAll()?另外,你得到什么错误?

标签: c# sql linq lambda nhlambdaextensions


【解决方案1】:

如果您想复制 SQL 查询的结果,它应该是 OrderByDescending 而不是 OrderBy

此外,如果您查看您的查询:

NewsletterGetAll()
.FirstOrDefault(c => c.NEWSLETTER_CATEGORY_ID == 1)
.OrderBy(a => a.Creation_Date)

在 SQL 中这没问题,因为它在 TOP 表达式之前计算 ORDER BY。但是,在 Linq 中,它将获取与类别匹配的第一条记录,然后对该单个记录进行排序。所以这甚至不会构建,你不能对单个项目进行排序。

所以应该是

NewsletterGetAll()
.Where(c => c.NEWSLETTER_CATEGORY_ID == 1)
.OrderByDescending(c => c.Creation_Date)
.FirstOrDefault();

【讨论】:

    【解决方案2】:

    使用 LINQPad 并进行专业的 LINQ 和 SQL 查询。这里是linqpad

    【讨论】:

    • 这不是一个好习惯,你必须知道转换才能更好地学习。
    【解决方案3】:

    当您不确定是否满足条件时,始终建议使用 First 或 Default,因为这也将处理 null 情况。表示,如果没有记录(有特定条件)。

    也取决于日期的顺序,这里认为日期是升序的,(较旧的日期在前)

    NewsletterGellAll().Where(c=>c.NEWSLETTER_CATEGORY_ID==1)
                        .OrderBy(a=>a.Creation_Date)
                        .FirstOrDefault();
    

    【讨论】:

    • 如何将 .ToList() 添加到您的代码中?有什么办法吗?
    • 返回List时使用ToList(),因为你只会得到一条记录,所以这里使用First或Default。
    【解决方案4】:

    先用cat==1查询所有item,然后排序得到第一个

    NewsletterGellAll().Where(c=>c.NEWSLETTER_CATEGORY_ID==1)
                       .OrderBy(a=>a.Creation_Date)
                       .First();
    

    【讨论】:

    • 当没有 category==1 的记录时,这可能会引发异常
    猜你喜欢
    • 1970-01-01
    • 2019-05-16
    • 1970-01-01
    • 1970-01-01
    • 2012-06-14
    • 2017-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多