0

如何处理这样的复杂数据查询以获得良好的性能:

在我的数据访问层:

public IEnumerable<Serie> Search(SearchCriteria searchCriteria)
{
    //Operation to have my predicate...
    return ListAll().Where(predicate);
}

在我的 SerieFicheViewModel 适配器中,以使我的实体适应 ViewModel :

public static List<SerieFicheViewModel> ToViewModel(int utilisateurProfilId, IEnumerable<Serie> series, int utilisateurId, List<string> roles)
{
    IEnumerable<SerieFicheViewModel> seriesFiches =
                from s in series
                select new SerieFicheViewModel
                {
                    serie = SerieAdapter.ToViewModel(s, utilisateurId, SerieAdapter.TypeReponseEnum.Small),
                    serieUtilisateur = SerieUtilisateurAdapter.ToViewModel(s, utilisateurId, roles)
                };

    return seriesFiches.ToList();
}

我的系列适配器:

public static SerieViewModel ToViewModel(Serie serie, int utilisateurId, TypeReponseEnum typeReponse)
{
    SaisonBusiness _saisonBusiness = (SaisonBusiness)UnityHelper.BusinessResolve<Saison>();
    EpisodeBusiness _episodeBusiness = (EpisodeBusiness)UnityHelper.BusinessResolve<Episode>();

    int nombreSaisonsValides = _saisonBusiness.GetNombreSaisonsValides(serie.serie_id);

    SerieViewModel SerieViewModel = new SerieViewModel
    {
        id = serie.serie_id,
        dateAjout = serie.serie_dateajout.ToString("dd/MM/yyyy HH:mm"),
        nomVf = serie.Prestation.prestation_nom,
        nomOriginal = serie.Prestation.prestation_nom2,
        nom = serie.Prestation.prestation_nom,
        imageThumbUrl = !string.IsNullOrEmpty(serie.Prestation.prestation_image_thumb) ? ConfigurationManager.AppSettings["AddictLive_BaseUrl"] + serie.Prestation.prestation_image_thumb.Replace("~", "").Substring(1) : string.Empty,
        imageUrl = !string.IsNullOrEmpty(serie.Prestation.prestation_image) ? ConfigurationManager.AppSettings["AddictLive_BaseUrl"] + serie.Prestation.prestation_image.Replace("~", "").Substring(1) : string.Empty,
        noteMoyenne = serie.Prestation.PrestationNotes.Count() > 0 ? serie.Prestation.PrestationNotes.Select(pn => pn.note).Average() : 0,
        synopsis = serie.Prestation.prestation_description,
        format = serie.serie_format,
        nombreDeNotes = serie.Prestation.PrestationNotes.Count(),
        remerciement = serie.UserAuth != null ? serie.UserAuth.DisplayName : string.Empty,
        statusProduction = serie.StatusProduction != null ? serie.StatusProduction.statusproduction_nom : string.Empty,
        duree = RenseignerDuree(serie),
        nombreSaisons = nombreSaisonsValides,
        nombreEpisodes = _episodeBusiness.GetNombreEpisodesValides(serie.serie_id),
        videoPrincipale = serie.serie_videoprincipale
    };

    SerieViewModel.ficheUrl = UrlTool.GetSerieFicheUrl(serie.serie_id, serie.Prestation.prestation_nom);

    PrestationNoteBusiness _prestationNoteBusiness = (PrestationNoteBusiness)UnityHelper.BusinessResolve<PrestationNote>();
    SerieViewModel.noteMoyenneEpisodes = _prestationNoteBusiness.GetMoyenneDeTousLesEpisodes(serie.serie_id);

    //Dispo tout le temps pour afficher un lien vers la premiere saison une fois qu'on a mis une série comme vue
    Saison saison = nombreSaisonsValides > 0 ? _saisonBusiness.GetPremiereSaisonValide(serie.serie_id) : null;
    if(saison != null)
        SerieViewModel.saisonUrl = UrlTool.GetSaisonUrl(saison.saison_id, saison.saison_numero.ToString(), serie.Prestation.prestation_nom);

    return SerieViewModel;
}

我没有放所有代码来尽量不污染请求,但是您可以看到我的适配器很复杂,我不知道如何自定义它们。

在上面的示例中,我使用延迟加载,并且在我的数据库中执行了超过 215 个查询

如果我尝试使用 Entity Framework Profiler 软件中推荐的急切加载:

public IEnumerable<Serie> Search(SearchCriteria searchCriteria)
{
    //Operation to have my predicate...
    return ListAll().Include(s => s.Prestation.PrestationNotes)
    .Include(s => s.UtilisateurSerieEtats)
    .Include(s => s.UtilisateurSerieSuivies)
    .Include(s => s.Saisons.Select(sai => sai.Episodes))
    .Where(predicate);
}

Entity framework Profiler 这次说joins太多了……显然我的请求太大了,恢复的数据也太多了,但是如何削减我的代码并提高性能呢?我几乎所有的适配器都有这种情况,我需要你的帮助。

提前感谢所有花时间阅读和帮助我的人

4

1 回答 1

0

提高性能的一种方法是创建一个视图(或多个视图)。然后,您的 EF 查询可以查询一个更简单的结构,并在一次调用时将所有数据拉回。

根据您可用的 SQL Server 版本,您可以使用索引视图,这会对性能产生巨大影响。

于 2013-11-12T19:32:32.997 回答