5

EF クエリでパフォーマンスに少し問題があります。

基本的にこれがあります:

public class Article
{
    public int ID { get; set; }
    public virtual List<Visit> Visits { get; set; }
}
public class Visit
{
    public int? ArticleID { get; set; }
    public DateTime Date { get; set; }
}

今、私はやりたい:

Article a = ...;
vm.Count = a.Visits.Count;

問題は、私が収集できることから、これにより最初にリスト全体がフェッチされ、次にそのカウントがフェッチされることです。これをループで実行すると、パフォーマンスの問題が発生します。

オブジェクトが「具体的すぎる」ことが原因であると想定したため、Visits.Count可能な限り呼び出しをリポジトリに戻そうとしました (DbContext を直接操作するように)。それは役に立ちませんでした。

助言がありますか?

4

3 に答える 3

0

データ コンテキストに Visits プロパティがあると仮定します。

public class MyDbContext: DbContext
{
    public IDbSet<Article> Articles { get; set; }
    public IDbSet<Visit> Visits { get; set; }
}

あなたはそれを行うことができます:

using (var ctx = new MyDbContext())
{
    var count = ctx.Visits.Where(x => x.ArticleID == 123).Count();
}

また、記事を扱うときに Visits コレクションが必ずしも必要でない場合は、次のように宣言できますIEnumerable<T>

public class Article
{
    public int ID { get; set; }
    public virtual IEnumerable<Visit> Visits { get; set; }
}

次に、遅延読み込みに依存します。

于 2013-04-22T10:50:47.280 に答える
0

パフォーマンスの問題は遅延読み込みにあると思います。(しかし、そのためのコードをもっと見る必要があります)。

dbcontext から記事を取得する瞬間に include(a => a.Visits) を試してください。

EF パフォーマンスの詳細については、http ://www.asp.net/web-forms/tutorials/continuing-with-ef/maximizing-performance-with-the-entity-framework-in-an-asp-net-web を参照してください。 -応用

于 2013-04-22T10:18:47.210 に答える
0

結局別の方法にしました。

これはさまざまな方法で何度もヒットしたことがわかりました。残りのドメイン モデルの設定方法のために、ちょっとしたハックを行いました。

私の VisitRepository では、新しい関数 GetArticleIDsWithVisit() を作成しました。これは、db.SqlQuery を介して直接 SQL 呼び出しを行い、Dictionary を返します。ディクショナリはキャッシュされ、訪問回数が必要なすべての場所で使用されます。

あまりきれいではありませんが、リポジトリ内にラップしているので問題ないと思います。

于 2013-04-22T16:07:06.630 に答える