1

多くのレイヤー (View、Model、DataAccess、Business) を持つ MVC プロジェクトがあり、DataAccessLayer で GenericDataRepository を使用しています。CompiledQueries を使用して GenericDataRepository のパフォーマンスを向上させたいと考えています。

これが私の GenericDataRepository で、シンプルにするための関数が 1 つだけあります...

public class GenericDataRepository<T> : IGenericDataRepository<T> where T : class
{
    public List<T> Get(Expression<Func<T, bool>> filter = null, Func<IQueryable<T>, IOrderedQueryable<T>> orderBy = null, params Expression<Func<T, object>>[] includes)
    {
        IQueryable<T> query = null;
        using (var context = new ZenHaberDBEntities())
        {
            query = context.Set<T>();

            foreach (Expression<Func<T, object>> include in includes)
                query = query.Include(include);

            if (filter != null)
                query = query.Where(filter);

            if (orderBy != null)
                query = orderBy(query);

            return query.ToList();
        }
    }

これは、GenericDataRepository を使用して DB からデータをプルする BusinessLayer のコードです。

public IList<Article> GetAllArticles()
{
    return _articleRepository.Get();
}

GetAllArticles() 関数を CompiledQueries に追加できますか? 誰もこれについて経験がありますか?

ここに私の文脈があります

public partial class ZenHaberDBEntities : DbContext
{
    public ZenHaberDBEntities()
        : base("name=ZenHaberDBEntities")
    {
        this.Configuration.LazyLoadingEnabled = false;
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        throw new UnintentionalCodeFirstException();
    }

    public virtual DbSet<Article> Article { get; set; }
    public virtual DbSet<ArticleMedia> ArticleMedia { get; set; }
    public virtual DbSet<ArticleTagRelation> ArticleTagRelation { get; set;       }
    public virtual DbSet<Category> Category { get; set; }
    public virtual DbSet<Currency> Currency { get; set; }
    public virtual DbSet<Tag> Tag { get; set; }
    public virtual DbSet<Weather> Weather { get; set; }
}


public static class DbContextExtensions
{
    public static ObjectContext ToObjectContext(this DbContext dbContext)
    {
        return (dbContext as IObjectContextAdapter).ObjectContext;
    }
}
4

1 に答える 1

1

CompiledQueriesは ObjectContext 派生モデルとのみ互換性があり、DbContext 派生モデルとは互換性がありません。したがってDbContext、使用できない場所を使用して派生させCompiledQueriesました。

しかし、Linq のクワイアのパフォーマンスを向上させるためのオプションは他にもたくさんあります。以下の記事では、それに関する多くの詳細を示しています。

EF のパフォーマンスに関する考慮事項

注 :このセクションについて確認する必要がある場合はCompiledQuery、上記のリンクのこのタイトルの下を参照してください: 3.3 CompiledQuery を使用して LINQ クエリでパフォーマンスを改善する

于 2016-11-19T10:57:14.880 に答える