0

次のような複雑なデータ クエリで良好なパフォーマンスを得るにはどうすればよいですか。

私のデータアクセスレイヤーで:

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

私の SerieFicheViewModel Adapter で、私のエンティティを 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 は、今回は結合が多すぎると述べました...明らかに、私の要求は大きすぎて、回復されたデータが多すぎますが、コードをカットしてパフォーマンスを向上させるにはどうすればよいですか? ほとんどすべてのアダプターでこの状況が発生しており、あなたの助けが必要です。

時間を割いて読んで助けてくれたすべての人に前もって感謝します

4

1 に答える 1

0

パフォーマンスを改善する 1 つの方法は、ビュー (または複数のビュー) を作成することです。EF クエリは、はるかに単純な構造を照会し、1 回の呼び出しですべてのデータを取得できます。

利用可能な SQL Server のバージョンによっては、インデックス付きビューを使用できますが、これはパフォーマンスに劇的な影響を与える可能性があります。

于 2013-11-12T19:32:32.997 に答える