使用 Linq 的 OrderBy GroupBy
OrderBy GroupBy using Linq
我的 linq 查询有问题。
有两个表,Thread
和 Post
。
它的构建就像一个论坛。
public class Post
{
public int PostID { get; set; }
public int ThreadID { get; set; }
public DateTime Time { get; set; }
public virtual Thread Thread { get; set; }
}
public class Thread
{
public int ThreadID { get; set; }
public string Title { get; set; }
public virtual ICollection<Post> Posts { get; set; }
}
Threads:
"1, Thread A"
"2, Thread B"
Posts:
"1, 1, 01.01.15"
"2, 1, 02.01.15"
"3, 1, 03.01.15"
"4, 2, 01.01.15"
Expected result:
"3, 1, 03.01.15"
"4, 2, 01.01.15"
我想按 ThreadID
对所有 post 进行分组,但我希望使用 Time
.[=17 按最新的 post 对其进行排序=]
这是我的查询。
Posts.OrderByDescending(x => x.Time).GroupBy(x => x.ThreadID).Select(x => x.FirstOrDefault());
这 return 个不同的 post,但它找到最旧的 post,而不是最新的。
如果我使用这个代码。
Posts.OrderByDescending(x => x.Time)
我得到了正确的排序,但不是不同的 posts。
我错过了什么?
如果你想要每个线程中的最新 post,试试这个:
Posts.GroupBy(x => x.ThreadID)
.Select(x => x.OrderByDescending(y => y.Time).FirstOrDefault())
.OrderByDescending(x => x.Time);
如果你想要 all posts,按线程分组,按照线程中最新 post 的顺序,然后试试这个:
Posts.OrderByDescending(x => x.Time)
.GroupBy(x => x.ThreadID)
.SelectMany(x => x.OrderByDescending(y => y.Time));
可能需要两个 order-by 语句,因为第一个将按时间对整个列表进行排序,第二个将确保项目在分组后仍然排序。 SelectMany
将确保您得到所有 post,而不是每组一个。
通过测试,您可能会发现可能不需要二次排序。这仅取决于分组期间是否保持顺序。 (我没查过)
我的 linq 查询有问题。
有两个表,Thread
和 Post
。
它的构建就像一个论坛。
public class Post
{
public int PostID { get; set; }
public int ThreadID { get; set; }
public DateTime Time { get; set; }
public virtual Thread Thread { get; set; }
}
public class Thread
{
public int ThreadID { get; set; }
public string Title { get; set; }
public virtual ICollection<Post> Posts { get; set; }
}
Threads:
"1, Thread A"
"2, Thread B"
Posts:
"1, 1, 01.01.15"
"2, 1, 02.01.15"
"3, 1, 03.01.15"
"4, 2, 01.01.15"
Expected result:
"3, 1, 03.01.15"
"4, 2, 01.01.15"
我想按 ThreadID
对所有 post 进行分组,但我希望使用 Time
.[=17 按最新的 post 对其进行排序=]
这是我的查询。
Posts.OrderByDescending(x => x.Time).GroupBy(x => x.ThreadID).Select(x => x.FirstOrDefault());
这 return 个不同的 post,但它找到最旧的 post,而不是最新的。
如果我使用这个代码。
Posts.OrderByDescending(x => x.Time)
我得到了正确的排序,但不是不同的 posts。
我错过了什么?
如果你想要每个线程中的最新 post,试试这个:
Posts.GroupBy(x => x.ThreadID)
.Select(x => x.OrderByDescending(y => y.Time).FirstOrDefault())
.OrderByDescending(x => x.Time);
如果你想要 all posts,按线程分组,按照线程中最新 post 的顺序,然后试试这个:
Posts.OrderByDescending(x => x.Time)
.GroupBy(x => x.ThreadID)
.SelectMany(x => x.OrderByDescending(y => y.Time));
可能需要两个 order-by 语句,因为第一个将按时间对整个列表进行排序,第二个将确保项目在分组后仍然排序。 SelectMany
将确保您得到所有 post,而不是每组一个。
通过测试,您可能会发现可能不需要二次排序。这仅取决于分组期间是否保持顺序。 (我没查过)