如何扩展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"为例?
您可以向存储库添加如下方法:
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/