我从Linq查询返回一个列表,之后我必须用for循环填充它中的值。 问题是它太慢了。查询和foreach的Linq优化
var formentries = (from f in db.bNetFormEntries
join s in db.bNetFormStatus on f.StatusID.Value equals s.StatusID into entryStatus
join s2 in db.bNetFormStatus on f.ExternalStatusID.Value equals s2.StatusID into entryStatus2
where f.FormID == formID
orderby f.FormEntryID descending
select new FormEntry
{
FormEntryID = f.FormEntryID,
FormID = f.FormID,
IPAddress = f.IpAddress,
UserAgent = f.UserAgent,
CreatedBy = f.CreatedBy,
CreatedDate = f.CreatedDate,
UpdatedBy = f.UpdatedBy,
UpdatedDate = f.UpdatedDate,
StatusID = f.StatusID,
StatusText = entryStatus.FirstOrDefault().Status,
ExternalStatusID = f.ExternalStatusID,
ExternalStatusText = entryStatus2.FirstOrDefault().Status
}).ToList();
,然后我以这种方式使用的:
for(var x=0; x<formentries.Count(); x++)
{
var values = (from e in entryvalues
where e.FormEntryID.Equals(formentries.ElementAt(x).FormEntryID)
select e).ToList<FormEntryValue>();
formentries.ElementAt(x).Values = values;
}
return formentries.ToDictionary(entry => entry.FormEntryID, entry => entry);
但绝对是太慢了。 有没有办法让它更快?
每次调用formentries.Count和formentries.ElementAt都会再次执行基础查询。你应该缓存查询结果,并通过在Formentries上调用ToArray或ToList(在保存结果之前)对其进行操作,然后再通过Formentries执行你的逻辑 – Polity 2012-02-29 15:06:07
@Polity它已经物化的查询 – 2012-02-29 15:13:30
请不要在“C# “等等。这就是标签的用途。 – 2012-02-29 15:13:39