【问题标题】:LINQ join and groupLINQ 加入和分组
【发布时间】:2011-05-10 13:33:27
【问题描述】:

我是 LINQ 新手,我正在尝试将此 SQL 查询转换为其等效的 LINQ:

select S.*
from Singles S
join (
    select max(SingleId) as SingleId
    from Single 
    group by ArtistId) S2 on S2.SingleId = S.SingleId
order by Released desc

表格如下所示:

 -----------
| Singles   |
|-----------|
| SingleID  |
| ArtistId  |
| Released  |
| Title     |
| .....     |
 -----------

等等…… 并包含例如这些项目:

SingleID   ArtistID    Released    Title
1          1           2011-05-10  Title1
2          1           2011-05-10  Title2
3          2           2011-05-10  Title3
4          3           2011-05-10  Title4
5          4           2011-05-10  Title5
6          2           2011-05-10  Title6
7          3           2011-05-10  Title7
8          5           2011-05-10  Title8
9          6           2011-05-10  Title9

所以我正在尝试获取最新的单曲,但每个艺术家只有一首。有人可以帮我吗? :) 也许还有更好的方法来编写查询?

更新:

要回答 cmets 中发布的问题: 我们正在使用 Microsoft SQL Server 和 LINQ to NHibernate。

这是我们现在使用的一个示例,它返回最新的单曲,没有按艺术家 ID 分组:

public Single[] GetLatest()
{
    IQueryable<Single> q;
    q = from s in _sess.Query<Single>()
        where s.State == State.Released
        orderby s.Released descending
        select s;

    return q.Take(20).ToArray();
}

【问题讨论】:

  • 是用于 SQL-Server 还是其他 DBMS ?
  • 你在做什么? LINQ到SQL? LINQ 到对象?请向我们展示您已有的代码。
  • 已更新以回答您的问题。

标签: c# .net sql linq nhibernate


【解决方案1】:

这个怎么样:

var firstSingles = Singles.GroupBy(x => x.ArtistId)
                          .Select(g => g.OrderByDescending(x => x.Released).First())
                          .ToList();

【讨论】:

  • 这给了我一个例外。 [InvalidOperationException:代码应该无法访问] System.Linq.Expressions.Compiler.StackSpiller.RewriteExpression(....
  • @AmITheRWord:经过一​​些快速研究,似乎GroubBy 与其他运算符的组合可能是问题的原因(另见stackoverflow.com/questions/5069925/…) - 这是一个如何重写查询的猜谜游戏让它发挥作用。
  • 谢谢!现在我至少可以继续前进了。 :)
【解决方案2】:

这样的事情应该可以工作。

var query = from s in db.Singles
            group s by s.ArtistID into sg
            let firstSingle = sg.OrderByDescending(r => r.SingleID).FirstOrDefault()
            select new
            {
              ArtistID = sg.Key,
              SingleID = firstSingle.SingleID,
              Released = firstSingle.Released,
              Title = firstSingle.Title,
            }

【讨论】:

  • 您可以使用let 关键字在查询中定义范围变量:let firstSingle = sg.OrderByDescending(r =&gt; r.SingleID).First()
【解决方案3】:
singles
    .OrderByDescending(s => s.SingleID)
    .GroupBy(s => s.SingerID, (id, s) => new
    {
         SingleID = id,
         Title = s.First().Title
    });

【讨论】:

    猜你喜欢
    • 2017-06-24
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 2012-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多