2016-11-19 3 views
1

У меня есть проект MVC со многими слоями (View, Model, DataAccess, Business), и я использую GenericDataRepository в моем DataAccessLayer. Я хотел бы повысить производительность GenericDataRepository с помощью CompiledQueries.GenericDataRepository со скомпилированными запросами

вот мой GenericDataRepository только одна функция, чтобы держать его просто ...

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(); 
     } 
    } 

и это код в BusinessLayer, который использует GenericDataRepository для извлечения данных из БД.

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; 
    } 
} 
+0

может вы показать свой класс 'context' также? – Sampath

+0

@Sampath, я добавил его –

ответ

1

CompiledQueries совместимы только с ObjectContext-производных моделей, и он не совместим с DbContext производный models.Hence вы извлекли его с помощью DbContext, где вы не можете использовать CompiledQueries.

Но у вас есть так много других возможностей для улучшения производительности ваших запросов Linq. В статье содержится много подробностей об этом.

Performance Considerations for EF

Примечание: Если вам нужно увидеть о разделе CompiledQuery, смотрите под этим названием на указанной выше ссылке: 3.3 Использование CompiledQuery для повышения производительности с помощью LINQ запросов

+0

Можно ли легко конвертировать DbContect в ObjectContext? Я должен прочитать это. некоторая информация будет большой :) –

+0

см. раздел ** Примечание **. – Sampath