如何运行 Linq 的排序依据和分组依据
本文关键字:排序 Linq 何运行 运行 | 更新日期: 2023-09-27 18:32:02
我在数据库中有三个表
- 凭证问题集合
- 发布 帖子评论
- (包含帖子表的多个评论)
表之间的关系为
VoucherQuestionCollection.discussionid = Post.PostId
and Post.PostId = PostComment.PostId
凭证问题集合表有一列名为"WonDate",其中包含日期时间值。我需要的是,我需要根据以下条件从凭证问题收集表中获取数据:-
- VoucherQuestionsCollection的WonDate应该是最少的日期(比如说第一个过期 的日期)
- 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 中写同样的东西
从数据库结构的外观来看,您无需按分组方式进行分组。只需按VoucherWonDate
降序排序,然后按关联Post
的PostComments
数排序即可。
尝试类似操作:
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 子句。