如何运行 Linq 的排序依据和分组依据

本文关键字:排序 Linq 何运行 运行 | 更新日期: 2023-09-27 18:32:02

我在数据库中有三个表

  1. 凭证问题集合
  2. 发布
  3. 帖子评论
  4. (包含帖子表的多个评论

表之间的关系为

VoucherQuestionCollection.discussionid = Post.PostId
and Post.PostId = PostComment.PostId

凭证问题集合表有一列名为"WonDate",其中包含日期时间值。我需要的是,我需要根据以下条件从凭证问题收集表中获取数据:-

  1. VoucherQuestionsCollection的WonDate应该是最少的日期(比如说第一个过期
  2. 的日期)
  3. PostComment的评论计数也应该是最少的计数。(这是评论最少的帖子)

那么,如何通过考虑上述条件在 Linq 中构建查询以生成所需的输出呢?

这就是我到目前为止所做的,但坚持如何进一步进行。

 var voucherQuestionTotalCollection = (from voucherQuestionCollection in this.GetDbSet<Jimble.Model.VoucherQuestionCollection>()
                                                  join posts in this.GetDbSet<Jimble.Model.Post>() on voucherQuestionCollection.DiscussionId equals posts.PostId
                                                  join comm in this.GetDbSet<Jimble.Model.PostComment>() on posts.PostId equals comm.PostId into gj
                                                  from sub in gj.GroupBy(c => c.PostId).Select(g => new { Available = g.Count() }).DefaultIfEmpty()
                                                  where voucherQuestionCollection.UserId != userId && voucherQuestionCollection.VoucherWonDate > DateTime.Now.AddDays(-7)
                                                  orderby voucherQuestionCollection.VoucherWonDate descending
                                                  select new { Id = voucherQuestionCollection .Id,
                                                               VoucherWonDate = voucherQuestionCollection.VoucherWonDate,
                                                               DiscussionId = voucherQuestionCollection.DiscussionId,
                                                               TotCommentCount = sub.Available
                                                  }).OrderBy(c=>c.TotCommentCount);

示例表

VoucherQuestionCollection                    Post                    PostComment
Id  DiscussionId   WonDate                   Id     PostText         Id   PostId   CommentText
1   1              2014-11-21 17:13:00.113   1      FirstPost        1    1        CommentText1
2   2              2014-11-22 17:13:00.113   2      SecondPost       2    1        CommentText2
3   3              2014-11-23 17:13:00.113   3      ThridPost        3    2        CommentText3
4   4              2014-11-24 17:13:00.113   4      FourthPost       4    2        CommentText4
                                                                     5    2        CommentText5
                                                                     6    3        CommentText6

这是我需要的输出如果表状态如上所示,则预期输出是 VoucherCollectionTable 的第 3 个条目,因为它在注释表中只有一个计数。如果PostComment表有相等的注释,我需要从VoucherCollectionTable获取条目1,因为最少日期是2014-11-21 17:13:00.113

注意:凭证问题集合将有多个条目,我只需要根据上述条件获取六条记录。

难以理解我上面的解释,只是这是 SQl 查询

Select * from VoucherQuestionCollections a 
inner join Posts b on a.DiscussionId = b.PostId
Left join (Select PostComments.PostId,COUNT(PostComments.PostId) as tot from PostComments Group    by PostComments.PostId)c on b.PostId = c.PostId
order by a.VoucherWonDate,c.tot

如何在 Linq 中写同样的东西

如何运行 Linq 的排序依据和分组依据

从数据库结构的外观来看,您无需按分组方式进行分组。只需按VoucherWonDate降序排序,然后按关联PostPostComments数排序即可。

尝试类似操作:

var voucherQuestionTotalCollection = 
this.GetDbSet<Model.VoucherQuestionCollection>()
.Where(p => p.UserId != userId )
.OrderByDescending(p => p.VoucherWonDate)
.ThenBy(p => p.Post.SelectMany(q => q.PostComments).Count());

我已经包含了您的查询中未在问题中提到的 where 子句。