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 のコンテンツ テーブルにインデックスがあります。

私のクラスは、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" のチェックを追加するにはどうすればよいですか?

4

2 に答える 2

0

LINQ で Entity Framework を使用する場合、たとえば次のような場合に、最適化されたクエリを生成してデータベースに送信しようとします。

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 は優れたパフォーマンスのクエリを生成します。詳細については、次の URL をお勧めします: http://www.sql-server-performance.com/2012/entity-framework-performance-optimization/

于 2013-06-20T09:24:08.553 に答える