Nik*_*asJ 5 c# asp.net-mvc entity-framework entity-framework-4
我在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; }
}
Run Code Online (Sandbox Code Playgroud)
现在,我想做:
Article a = ...;
vm.Count = a.Visits.Count;
Run Code Online (Sandbox Code Playgroud)
问题是,从我可以收集的内容来看,这首先导致整个列表被提取,然后是它的计数.在循环中执行此操作时,会产生性能问题.
我认为这是由于对象"太具体",所以我试图尽可能地将Visits.Count调用移回存储库中(这样我们就可以直接使用DbContext了).这没有用.
有什么建议?
假设您的数据上下文具有 Visits 属性:
public class MyDbContext: DbContext
{
public IDbSet<Article> Articles { get; set; }
public IDbSet<Visit> Visits { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
你可以这样做:
using (var ctx = new MyDbContext())
{
var count = ctx.Visits.Where(x => x.ArticleID == 123).Count();
}
Run Code Online (Sandbox Code Playgroud)
此外,如果在处理文章时并不总是需要 Visits 集合,您可以将其声明为IEnumerable<T>:
public class Article
{
public int ID { get; set; }
public virtual IEnumerable<Visit> Visits { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后依靠延迟加载。
| 归档时间: |
|
| 查看次数: |
358 次 |
| 最近记录: |