我有以下内容:
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”的位置?
答案 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/