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

最后我用了另一种方式。

我发现这以不同的方式一遍又一遍地被击中,并且由于域模型的其余部分的设置方式,我做了一些修改:

在我的 VisitRepository 中,我创建了一个新函数 GetArticleIDsWithVisit(),它通过 db.SqlQuery 进行直接 sql 调用,返回一个 Dictionary。该字典被缓存并用于所有需要访问计数的地方。

不是很漂亮,但我已经将它包装在存储库中,所以我认为没关系。

于 2013-04-22T16:07:06.630 回答
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 检索文章时尝试包含(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 回答