LINQ子查询中的orderby问题

4

我希望在LINQ to EF中进行一个简单的子查询。

我做了这样的事情:

from p in db.SomeTable
let o = db.SomeTableWithDate
            .OrderByDescending(t => t.Date)
            .FirstOrDefault(lt => lt.SomeValue == value)
select new {p, o}

所有东西都编译通过了,LINQ没有抱怨,但结果是错误的。生成的SQL是一个带有TOP 1的OUTER APPLY,但没有'ORDER BY'。

我也尝试了这个:

from p in db.SomeTable
select new {
    p, 
    o = db.SomeTableWithDate
            .OrderByDescending(t => t.Date)
            .FirstOrDefault(lt => lt.SomeValue == value)
}

但是我得到了相同的结果。(我更喜欢“let”,因为然后我可以使用上一个“let”查询中的变量)

所以这是我的问题:如何让LINQ进行带有orderby的真正子查询?

我想从链接表中获取最新日期

解决方案

来自博伦的答案解决了它。我只需要先做一个单独的where。

from p in db.SomeTable
let o = db.SomeTableWithDate
            .Where(lt => lt.SomeValue == value)
            .OrderByDescending(t => t.Date)
            .FirstOrDefault()
select new {p, o}

1
@boran,我认为这是一个外键。 - Silvermind
2
生成的 SQL 是什么? - Silvermind
1个回答

3
 from p in db.SomeTable
 let o = db.SomeTableWithDate.Where(lt => lt.SomeValue == value)
        .OrderByDescending(t => t.Date)
        .FirstOrDefault()
 select new {p, o}

由于您进行了筛选后再进行排序,因此这个查询的性能可能会更好。


2
即使您使用“1”作为参数调用它,“Take”仍会返回“IEnumerable<T>”,因此即使它可以工作(我不确定),结果也会与预期有所不同:“o”将是“IEnumerable<T>”而不仅仅是“T”。 - MarcinJuraszek
使用单独的where解决了问题(不需要使用Take)。 - roeland

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接