查询实体框架与SQL Server中的执行时间

时间:2014-04-29 06:20:22

标签: c# sql-server database entity-framework linq-to-entities

我有一个用Linq To Entities编写的查询:

db.Table<Operation>()
    .Where(x => x.Date >= dateStart)
    .Where(x => x.Date < dateEnd)
    .GroupBy(x => new
    {
        x.EntityId,
        x.EntityName,
        x.EntityToken
    })
    .Select(x => new EntityBrief
    {
        EntityId = x.Key.EntityId,
        EntityName = x.Key.EntityName,
        EntityToken = x.Key.EntityToken,
        Quantity = x.Count()
    })
    .OrderByDescending(x => x.Quantity)
    .Take(5)
    .ToList();

问题是使用EF在应用程序中执行时需要4秒。但是当我从该查询对象中获取创建的纯SQL查询(使用Log)并直接在SQL Server上激活它时,则需要0秒。这是一个众所周知的问题吗?

2 个答案:

答案 0 :(得分:0)

首先,尝试改进您的查询:

var entityBriefs = 
  Table<Operation>().Where(x => x.Date >= dateStart && x.Date < dateEnd)
                    .GroupBy(x => x.EntityId)
                    .OrderByDescending(x => x.Count())
                    .Take(5)
                    .Select(x => new EntityBrief
                    {
                        EntityId = x.Key.EntityId, 
                        Quantity = x.Count()
                    });

var c = entityBriefs.ToDictionary(e => e.EntityId, e => e);

var entityInfo = Table<Operation>().Where(o => mapping.Keys.Contains(o.EntityId).ToList();

foreach(var entity in entityInfo)
{
   mapping[entity.EntityId].EntityName = entity.EntityName;
   mapping[entity.EntityId].EntityToken = entity.EntityToken;
}

您也可以在CompiledQuery.Compile的帮助下编译查询,并进一步使用它以提高性能。

http://msdn.microsoft.com/en-us/library/bb399335%28v=vs.110%29.aspx

答案 1 :(得分:0)

问题出在数据库锁上。我使用了错误的隔离级别,因此在某些情况下我的查询被阻止了。现在我使用read-commited-snapshot,执行时间看起来不错。