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

本文关键字:执行 复杂 查询 模型 何扩展 扩展 存储 EF | 更新日期: 2023-09-27 18:19:05

我有以下内容:

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数据库中,我有一个索引的内容表的subbectid和ContentTypeId

我的类正在与标准存储库一起工作,该存储库具有GetAll()和GetId(id)等方法,但是使用存储库模型是我可以执行更复杂查询的方法。在这种情况下,我想以某种方式对特定的sujid和contentTypeId进行查询。我想避免的是有一个查询,得到每一个内容记录,然后过滤掉我需要的。我想通过某种方式发送一个真正的查询,我需要什么SQL服务器。

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

    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"为例?

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

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

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

然后写:

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

如果你在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 Profiler):

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

有一些需要考虑的因素,但大多数情况下EF会生成良好的性能查询。要了解更多,我推荐以下URL: http://www.sql-server-performance.com/2012/entity-framework-performance-optimization/