在我的应用程序中,我首先使用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);
答案 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);