如何扩展EF存储库模型以执行更复杂的查询?

时间:2013-06-20 08:46:39

标签: c# entity-framework asp.net-mvc-4 entity-framework-4

我有以下内容:

public partial class Subject
{
    public Subject()
    {
        this.Contents = new List<Content>(); 
    }
    public int SubjectId { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Content> Contents { get; set; }
}

public partial class Content
{
    public int ContentId { get; set; }
    public int ContentTypeId { get; set; }
    public string Title { get; set; }
    public string Text { get; set; }

    public int SubjectId { get; set; }
    public virtual Subject Subject { get; set; }
}

在我的SQL Server数据库中,我在SubectId和ContentTypeId的Content表上有一个索引

我的类正在使用具有诸如GetAll()和GetId(id)之类的方法的标准存储库查找,但是使用存储库模型有一种方法可以执行更复杂的查询。在这种情况下,我会以某种方式想要查询特定的SujectId和contentTypeId。我想要避免的是拥有一个获取每个内容记录的查询,然后筛选出我需要的内容。我想用某种方式发送一个真正的查询,确切地说我需要SQL Server。

目前,我的通用存储库具有以下内容:

    public virtual T GetById(int id)
    {
        return DbSet.Find(id);
    }

我可以通过实现创建ContentRepository并执行以下操作来完成我需要的工作:

    public IQuerable<Content> GetAllBySubjectId(int id)
    {
        return DbSet.Where(c => c.SubjectId == id);
    }

如果是,那么我如何使用GetAllBySubjectId并添加检查ContentId ==“01”的位置?

2 个答案:

答案 0 :(得分:1)

您可以向您的存储库添加如下方法:

public IQueryable<T> Find(Expression<Func<T, bool>> predicate)
{
    return DbSet.Where<T>(predicate);
}

然后写一下:

repository.Find(c => c.SubjectId == myId);

答案 1 :(得分:0)

如果您将实体框架与LINQ一起使用,它将尝试生成优化查询并将优先级查询发送到数据库,例如,如果您执行以下操作:

var contents = 
    from c in Context.Contents  //  or directly the DbSet of Contents
    where c.ContentTypeId == 2
    select new { c.Title, c.ContentId };

它应该按照以下行生成查询(您可以使用SQL事件探查器):

    select 
        c.Title as Title,
        c.ContentId as ContentId
    from Contents c
    where
        c.ContentTypeId == 2

需要考虑一些注意事项,但大多数时候EF会产生良好的性能查询。 要了解更多相关信息,建议您使用以下网址:http://www.sql-server-performance.com/2012/entity-framework-performance-optimization/