EF核心开销?

时间:2018-06-28 13:45:33

标签: c# .net sqlite entity-framework-core

我有一个运行在SqlLite上的代码优先EF Core代码库,该实体具有约20列和10行的一个实体。一页用以下代码请求此实体:

var start = DateTime.Now;
var entA = await _context.entA.FromSql("SELECT * FROM entA "+
    "where (Name like '%_Demo' or EXISTS(SELECT NULL FROM entB WHERE StudyId = entA.ID and email = @email)) AND IsDeleted = 0 "+
    "order by colC COLLATE NOCASE",
            new SqliteParameter("@email", User.Identity.Name)) 
    .ToListAsync();
log.Info($"User {User.Identity.Name} requested entA, in {DateTime.Now.Subtract(start).TotalMilliseconds}");

我已打开EF Core日志记录,并且看到带有

的查询
Executed DbCommand (2ms) [Parameters=[@email='?'], CommandType='Text', CommandTimeout='30']

但是在日志中(即使多次运行),我仍然看到

2018-06-28 15:16:49,442 INFO Controller - User user@domain.com requested entA, in 166,0095 

没有花费约160毫秒执行查询会发生什么情况?

更新:根据Xanatos的建议,我删除了await和async,幸运的是,我看到的数字差不多或多或少

INFO Controller - User user@domain.com requested entA, in 207,0118 
INFO Controller - User user@domain.com requested entA, in 164,0094 
INFO Controller - User user@domain.com requested entA, in 225,0129 
INFO Controller - User user@domain.com requested entA, in 180,0103 

如果.net在返回Task的结果之前等待100毫秒,那将非常可悲

编辑:我发现对于只读查询,关闭跟踪功能可以大大提高速度:

_context.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;

1 个答案:

答案 0 :(得分:1)

您正在使用QGraphicsView。不能严格保证在数据“就绪”的瞬间await会继续。如果要进行测量,请删除await并在await中更改ToListAsync()。然后我们可以谈论基准。