如何优化这个Linq查询

时间:2010-06-02 05:59:05

标签: c# linq-to-entities

我正在尝试优化此查询。它现在并不慢,但我预计在不久的将来会出现峰值。还有什么我可以做的,以使这个查询更快?

var posts = from p in context.post
                        where p.post_isdeleted == false && p.post_parentid == null
                        select new
                        {
                            p.post_date,
                            p.post_id,
                            p.post_titleslug,
                            p.post_title,
                            p.post_descriptionrender,
                            p.userinfo.user_username,
                            p.userinfo.user_userid,
                            p.userinfo.user_GravatarHash,
                            p.userinfo.user_points,
                            p.category.catid,
                            p.category.name,
                            p.post_answercount,
                            p.post_hasbestanswer,
                            p.post_hits,
                            p.post_isanonymous,
                            p.post_votecount,
                            FavoriteCount = context.favorites.Where(x => x.post.post_id == p.post_id).Count(),
                            tags = from tg in context.posttag
                                   where tg.posttag_postid == p.post_id
                                    select new
                                    {
                                        tg.tag.tag_id,
                                        tg.tag.tag_title
                                    }
                        };

3 个答案:

答案 0 :(得分:0)

在一般意义上,您可以查看缓存该信息,但对查询本质上没什么“慢”。这实际上取决于查询的使用方式(频率,搜索的数据等)。对于给定的问题,有许多可能的优化解决方案,虽然您可能会发现基于直觉的改进,如果您有适当的分析工具来确定问题区域,那么您将更容易这样做。此外,您将满意地证明您所改进的领域值得投入时间。

答案 1 :(得分:0)

此查询的一种可能优化方法是,仅加载其他相关对象(UserInfo,Category,Tag)的ID,并仅使用延迟加载策略按需初始化此对象。或执行其他查询来解析这些对象。

但这取决于您如何使用查询结果。也许您需要相关对象的所有信息,或者您只需要这些对象的一些信息或对象的Id就足够了,因为您需要其他查询的ID。

答案 2 :(得分:0)

我可以使LINQ 更清洁(通过using associations instead of psuedo-joins),但它不会让它更快。要使其更快,您可能需要查看数据库索引。