Linq优化查询和foreach

Att*_*ila 0 .net c# sql linq

我从Linq查询返回一个List,然后我必须用for循环填充其中的值.问题是它太慢了.

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();
Run Code Online (Sandbox Code Playgroud)

然后我以这种方式使用for:

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);
Run Code Online (Sandbox Code Playgroud)

但它肯定太慢了.有没有办法让它更快?

Eri*_*ert 7

这肯定太慢了.有没有办法让它更快?

也许.也许不吧.但这不是正确的问题.正确的问题是:

为什么这么慢?

如果您对第二个问题有答案,那么找出第一个问题的答案要容易得多!如果对第二个问题的答案是"因为数据库在东京而且我在罗马,而且数据包的移动速度不比光速快,这是我不可接受的减速的原因",那么你的方式是你搬到日本的速度越快; 没有多少修复查询将改变光速.

要弄清楚它为何如此慢,请找一个探查器.通过分析器运行代码,并使用它来确定您花费大部分时间的地方.然后看看你是否可以加速那部分.