EntityFremework:可以在优化之前选择吗?

问题描述 投票:0回答:2

我试图在这个查询上获得性能,我想知道在Where()之前调用Select()是否可以有一些改进:

 public async Task<List<PostValues>> GetValuesToTheDashboard(DataFilter filter, CancellationToken cancellationToken) {
                long startTimestanp = Helpers.UnixTimeNow(filter.StartDate);
                long endTimestanp = Helpers.UnixTimeNow(filter.EndDate);

                return await
                    _context.CatchDetails.Where(
                        x => x.Monitoring.Client.Id == filter.CustomerId && x.Data.published >= startTimestanp
                             && x.Data.published <= endTimestanp
                             && ((filter.Sentiment == Sentiments.ALL) || x.Sentiment_enum == filter.Sentiment)
                             && (filter.MonitoringId == 0 || x.Monitoring.id == filter.MonitoringId)
                             && (filter.KeywordId == 0 || x.Keyword.Id == filter.KeywordId)
                             && (filter.MotiveId == 0 || x.Motive.Id == filter.MotiveId)
                             && (filter.SocialNetwork.Count == 0 || filter.SocialNetwork.Any(s => x.Data.social_media == s))
                             && (filter.Busca == "" || x.Data.content_snippet.Contains(filter.Busca))
                             && (filter.Gender.Count == 0 || filter.Gender.Any(g => x.Data.extra_author_attributes.gender_enum == g)))
                             .Select(s => new PostValues() {
                                 CatchDetailsId=s.Id,
                                 Monitoring=s.Monitoring.name,
                                 Keyword=s.Keyword.Text,
                                 Motive=s.Motive.Name,
                                 Sentiment=s.Sentiment_enum,
                                 Gender=s.Data.extra_author_attributes.gender_enum,
                                 SocialMedia=s.Data.social_media,
                                 Country=s.Data.extra_author_attributes.world_data.country_code,
                                 State=s.Data.extra_author_attributes.world_data.region,
                                 Published=s.Data.published

                             }).ToListAsync(cancellationToken);
            }
c# entity-framework linq-to-sql query-optimization
2个回答
1
投票

可能有一种方法可以提高性能,但不会改变SelectWhere(如评论中提到的Chetan)。

您可以按顺序构建查询,并基于过滤器最终获得更简单的查询。这将是这样的:

var query = _context.CatchDetails.Where(
                x => x.Monitoring.Client.Id == filter.CustomerId && x.Data.published >= startTimestanp
                     && x.Data.published <= endTimestanp);
if (filter.Sentiment != Sentiments.ALL) 
{
    query = query.Where(x => x.Sentiment_enum == filter.Sentiment);
}
if (filter.MonitoringId != 0)
{
    query = query.Where(x => x.Monitoring.id == filter.MonitoringId);
}

[...]

return await 
    query.Select(s => new PostValues() {
        [...]
        }).ToListAsync(cancellationToken);

0
投票

不要忘记,当SQL返回数据时,变量query已经在应用程序的内存中。如果有很多结果,它可能会引发内存异常。

我建议你限制搜索的日期范围。

© www.soinside.com 2019 - 2024. All rights reserved.