LINQ选择不同的多列

时间:2013-05-10 16:08:49

标签: mysql linq .net-4.0 distinct sql-server-express

我已经看过其他几个这样的帖子,但是对于我的情况来说还不能完全解决。如果我有一个包含大量帖子的论坛,我想获得最新帖子的列表 - 但每个帖子只有一个帖子。所以我想要Distinct(threadID)但是最大(时间)。那些本身很容易,但我还想选择与该特定行相关的其他列

        var posts = from s in websiteDB.Forum_Post
                    orderby s.Time
                    select new ForumPostSummary()
                    {
                        UserID = s.UserID ?? default(int),
                        Time = s.Time ?? default(int),
                        Subject = s.Subject,
                        ThreadID = s.ThreadID ?? default(int)
                    };
        posts = posts.Take(10);

示例表:

| UserID | Time  | Subject | ThreadID |
| 1      | 10:00 | ABC     | 999      |
| 2      | 10:01 | Re:DEF  | 998      |
| 3      | 10:02 | Re:ABC  | 999      |
| 4      | 09:40 | DEF     | 998      |
| 5      | 09:45 | Re:DEF  | 998      |

我想要用户ID 3的行(线程999的最新时间和最新的整体时间)和用户ID 2(线程998的最新时间)。我只是为了解释我想要的行而引用结果的UserID。我实际上是在查询MySQL数据库中的数据并插入到SqlExpress中,尽管这个问题适用于略有不同形式的两个数据库!

| 3      | 10:02 | Re:ABC  | 999      |
| 2      | 10:01 | Re:DEF  | 998      |

1 个答案:

答案 0 :(得分:2)

听起来你需要通过ThreadID 分组,然后按时间(降序)对每个组进行排序,并从每个组中获取第一个值。如下所示:

var posts = from s in websiteDB.Forum_Post
            group s by s.ThreadID into thread
            select thread.OrderByDescending(t => t.Time).First() into recent
            select new ForumPostSummary
            {
                UserID = recent.UserID ?? default(int),
                Time = recent.Time ?? default(int),
                Subject = recent.Subject,
                ThreadID = recent.ThreadID ?? default(int)
            };
posts = posts.Take(10);