我有一个非常简单的edmx模型,只有一个数据库和一个实体对应一个数据库表。测试从本地虚拟数据库服务器中按顺序检索所有记录。
using System;
using System.Linq;
namespace ConsoleApplication1
{
using System.Diagnostics;
private static readonly ConcurrentBag<long> Stats = new ConcurrentBag<long>();
static void Main(string[] args)
{
for (int i = 0; i < 5; i++)
{
var sw = Stopwatch.StartNew();
using (var ctx = new ScratchEntities())
{
foreach (var invoice in ctx.Invoices.Select(
s => new
{
s.Id,
s.Amount,
s.DueDate
}))
{
}
}
sw.Stop();
Stats.Add(sw.ElapsedMilliseconds);
}
Console.WriteLine("Min {0} Max {1} Avg {2}", Stats.Min(), Stats.Max(), Stats.Average());
}
}
在EF 4和5下,执行需要约2-2.5秒。升级到Nuget的EF6后,需要近10秒。 类似地,使用foreach遍历ctx.Invoices时需要的时间大约是遍历ctx.Invoices.Select(s=>new{all columns here})的4-5倍。 感到困惑。 更新: 迭代5次 EF 6.0.1最小值3082,最大值9231,平均值4462.8 EF 5.0.0最小值1502,最大值2016,平均值1665.4 所有时间都是1M行的毫秒数。 .Net 4.5 更新2: 在105个测试中排除前五个测试 EF 6.0.1最小值2698,最大值4383,平均值3136 EF 5.0.0最小值1426,最大值2922,平均值1628 更新3: 按照这里的建议重新创建TT模板后 EF 6.0.1最小值2589,最大值4279,平均值3027 按照这里所述编译EF6后 EF 6.0.1最小值2644,最大值4322,平均值3045.7 更新4: 更改为AsEnumerable后 EF 6.0.1最小值2661,最大值4658,平均值3134.6