【发布时间】:2015-08-03 09:57:11
【问题描述】:
我有这段代码可以查看所有联系人并对发送给他们的每封电子邮件进行计数,如果他们没有打开/单击最后一个 X 数量,则将它们返回到列表中
目前代码运行大约需要 10 分钟,有什么可以改进的吗?
我知道我可以限制退回的金额,但这仍然很慢。
var contactList =
(from c in db.Contacts
where c.Accounts_CustomerID == Account.AccountID && !c.Deleted && !c.EmailOptOut
select c).ToList();
foreach (var person in contactList)
{
var SentEmails =
(from c in db.Comms_Emails_EmailsSents where c.ContactID == person.ID select c).OrderBy(
x => x.DateSent).Take(Last).ToList();
if (SentEmails.Count == Last)
{
if (!Clicks)
{
if (SentEmails.Count(x => x.Opens == 0) == Last)
{
ReturnContacts.Add(person);
}
}
else
{
if (SentEmails.Count(x => x.Clicks == 0) == Last)
{
ReturnContacts.Add(person);
}
}
}
}
return ReturnContacts;
【问题讨论】:
-
首先使用性能分析器(例如 dotTrace)来了解究竟是什么进展缓慢。
-
你需要一个 Join 查询。