Linq to Entities导航性能

时间:2015-02-09 10:08:08

标签: linq entity-framework

在我的应用程序中,我首先使用linq查询EF代码到实体。

我的db上下文包含两个实体Application和Status

class Application
{
    public string Id {get; set;}

    public string DossierId {get; set;}
    public virtual Dossier {get; set;}

    public DateTimeOffset CreatedDate {get; set;}

    public string LastStatusId {get; set;}
    public virtual Status LastStatus {get; set;}
}

class Status
{
    public string Id {get; set;}
    public string Name {get; set;}
}

这是我的查询

var dateDiff = DateTime.Now.AddMonths(-12);

var retVal = db.Applications
    .Where(app => app.CreatedDate > dateDiff)
    .GroupBy(app => app.DossierId, 
             app => app, 
             (dosId, app) => app.OrderByDescending(t => t.CreatedDate).FirstOrDefault())
    .Select(app => new GridData()
    {
        Id = app.Id,
        ActualState = app.LastStatus.Name,
        ApplicationDate = app.CreatedDate
    })
    .OrderBy(app=>app.ApplicationDate);

然后我以页面大小30分页结果。 我的性能问题取决于ActualState navigaton属性:如果我将其注释掉,执行速度非常快(不到一秒),而如果我查询ActualState,则执行速度很慢,因为它枚举了所有记录(十秒)。

你有任何提示吗?

谢谢, 的Alessandro

修改 我忘了提到代理已启用,并且我在状态和应用程序之间有自定义映射关系

this.HasRequired(app => app.LastStatus)
    .WithMany()
    .HasForeignKey(app => app.LastStatusId)
    .WillCascadeOnDelete(false);

1 个答案:

答案 0 :(得分:0)

尝试通过eager loading

添加状态
db.Applications.Include(p=>p.LastStatus)

您的更新代码:

var retVal = db.Applications.Include(p=>p.LastStatus)
    .Where(app => app.CreatedDate > dateDiff)
    .GroupBy(app => app.DossierId, 
             app => app, 
             (dosId, app) => app.OrderByDescending(t => t.CreatedDate).FirstOrDefault())
    .Select(app => new GridData()
    {
        Id = app.Id,
        ActualState = app.LastStatus.Name,
        ApplicationDate = app.CreatedDate
    })
    .OrderBy(app=>app.ApplicationDate);