带编译查询的GenericDataRepository

时间:2016-11-19 10:48:36

标签: c# entity-framework caching compiled-query

我有一个MVC项目有很多层(View,Model,DataAccess,Business),我在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从DB中提取数据。

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

1 个答案:

答案 0 :(得分:1)

CompiledQueries仅与ObjectContext派生的模型兼容,并且与DbContext派生的模型不兼容。您使用DbContext导出它,但不能使用CompiledQueries。< / p>

但是你有很多其他方法可以提高你的Linq quires的性能。下面的文章展示了很多关于它的细节。

Performance Considerations for EF

注意:如果您需要查看CompiledQuery部分,请在上面链接的标题下查看: 3.3使用CompiledQuery提高LINQ查询的性能< /强>