如何解决Linq是否可以优化这些子查询?
| 该查询接受一组注释,然后在tblCommentVotes表中计算其赞成和反对意见。 目前,它通过选择新语句以子查询的形式对它们进行计数。如果在主查询中按某种方式进行分组,这样做会更有效吗?如果可以的话,有人可以告诉我如何执行此操作,因为我无法确定您将如何执行此操作。// Get comments
var q = (
from C in db.tblComments
where
C.CategoryID == Category &&
C.IdentifierID == Identifier
join A in db.tblForumAuthors on C.UserID equals A.Author_ID
orderby C.PostDate descending
select new
{
C,A.Username,UpVotes = (from V in db.tblCommentVotes where V.CommentID == C.ID && V.UpVote == true select new { V.ID }).Count(),DownVotes = (from V in db.tblCommentVotes where V.CommentID == C.ID && V.UpVote == false select new { V.ID }).Count()
}
)
.Skip(ToSkip > 0 ? ToSkip : 0)
.Take(ToTake > 0 ? ToTake : int.MaxValue);
解决方法
您需要做的是在查询表达式中对
db.tblCommentVotes
进行左外部联接,原因可能是可能没有commentVotes?
有了它,您应该能够执行一次查询才能得到结果。
它可能看起来像这样:
var q = (
from C in db.tblComments
where
C.CategoryID == Category &&
C.IdentifierID == Identifier
join A in db.tblForumAuthors on C.UserID equals A.Author_ID
// the following two lines are the left outer join thing.
join voteTemp in db.tblCommentVotes on voteTemp.CommentID equals C.ID into voteJoin
from vote in voteJoin.DefaultIfEmpty()
orderby C.PostDate descending
group C by new { Comment = C,Username = A.Username } into g
select new
{
g.Key.Comment,g.Key.Username,UpVotes = g.Count(x => x.UpVote),DownVotes = g.Count(x => !x.UpVote)
}
)
.Skip(ToSkip > 0 ? ToSkip : 0)
.Take(ToTake > 0 ? ToTake : int.MaxValue);
这未经测试,甚至可能无法编译,但我认为应该是这样的。
,db.tblComments.Where(c => c.CategoryID == Category && c.IdentifierID == Identifier)
.Join(db.tblForumAuthors,c => c.UserID,a => a.Author_ID,(c,a) =>
new
{
CommentID = c,AuthorName = a.UserName,UpVotes = c.Join(db.tblCommentVotes,c => c.CommentID
v => v.CommentID,v) => v).Count(v => v.UpVote)
DownVotes = c.Join(db.tblCommentVotes,c => c.CommentID
v => v.CommentID,v) => v).Count(v => v.DownVote)
});
,要进行优化,最好首先进行测量。
尝试使用类似LinqPad的方法查看生成的SQL
然后使用SQL Server Management Studio查看该SQL的查询计划
要么:
尝试运行代码,看看SQL跟踪告诉您正在发生什么
如果没有数据库,很难猜测Linq是要生成一个UpVotes还是DownVotes一个查询还是多个查询。我的猜测是,以这种方式计算UpVotes和DownVotes可能会非常昂贵-每个评论可能会导致2个额外的查询。
,http://www.thereforesystems.com/view-query-generate-by-linq-to-sql/
如果不分析所输出的内容,则无法回答此问题。.但是,上面提供的链接应为您提供必要的工具,您可以自己执行此分析。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。