【发布时间】:2014-12-02 23:42:15
【问题描述】:
我创建了一个使用 EF 6 的简单方法,该方法将根据一些输入信息和一些可能的 Type 和 SubType 值进行分组查询,如下所示
public int GetOriginal(DateTime startDate, DateTime endDate, List<int> userIds)
{
DateTime dt = DateTime.UtcNow;
var ret = DbContext.ContactFeedback
.Where(c => c.FeedbackDate >= startDate &&
c.FeedbackDate <= endDate && userIds.Contains(c.UserId) &&
(c.Type == FeedbackType.A || c.Type == FeedbackType.B || c.Type == FeedbackType.C))
.GroupBy(x => new {TruncateTime = DbFunctions.TruncateTime(x.FeedbackDate), x.LeadId, x.UserId})
.Count();
Console.WriteLine(string.Format("{0}",DateTime.UtcNow - dt));
return ret;
}
它按预期工作,但是如果我尝试创建一个新的辅助方法,该方法接收“查询”(Func 类型对象)作为要运行的输入,我会发现性能差异很大,我无法做到解释一下,因为它们应该运行完全相同。 这是我重写的方法
public int GetRewritten(DateTime startDate, DateTime endDate, List<int> userIds)
{
DateTime dt = DateTime.UtcNow;
var query = new Func<ContactFeedback, bool>(c => c.FeedbackDate >= startDate && c.FeedbackDate <= endDate && userIds.Contains(c.UserId) &&
(c.Type == FeedbackType.A || c.Type == FeedbackType.B ||
c.Type == FeedbackType.C));
var ret = GetTotalLeadsByFeedback(query);
Console.WriteLine(string.Format("{0}",DateTime.UtcNow - dt));
return ret;
}
private int GetTotalLeadsByFeedback(Func<ContactFeedback, bool> query)
{
return DbContext.ContactFeedback
.Where(query)
.GroupBy(x => new { TruncateTime = DbFunctions.TruncateTime(x.FeedbackDate), x.LeadId, x.UserId })
.Count();
}
这里是以秒为单位的运行时间
GetOriginal 有 1 个用户 ID:0.0156318 - 有大约 100 个用户 ID:0.1455635
GetRewritten 使用 1 个用户 ID:0.4742711 - 使用约 100 个用户 ID:7.2555701
您可以看到差异很大,任何人都可以分享一下为什么会发生这种情况?
如果有帮助,我将使用 SQL Server DB 在 Azure 上运行所有内容
【问题讨论】:
-
这篇 SO 帖子解释了为什么 stackoverflow.com/questions/793571/…
标签: c# linq entity-framework linq-to-sql entity-framework-6