0

我有以下内容:

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 并添加检查 where ContentId == "01" 例如?

4

2 回答 2

1

您可以向您的存储库添加这样的方法:

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

然后像这样写:

repository.Find(c => c.SubjectId == myId);
于 2013-06-20T09:02:47.707 回答
0

如果您将 Entity Framework 与 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/

于 2013-06-20T09:24:08.553 回答