【问题标题】:Speed up EF5 Code First query加快 EF5 代码优先查询
【发布时间】:2013-12-04 19:09:59
【问题描述】:

使用 EF5 Code First、SQL Server 2008 R2 db、通用存储库和工作单元模式接续之前的问题

我有以下功能

public static void MoveGraphicPosition(int queueId, int graphicId, bool moveUp)
{
    using (var unitOfWork = new GraphicUnitOfWork(ConnGraphics, false))
    {
        var sourceGraphic = unitOfWork.GraphicRepository.FindSingle(g => g.Id == graphicId);

        if (sourceGraphic == null) return;

        var startPosition = sourceGraphic.QueuePosition;

        Graphic targetGraphic;

        if (moveUp)
        {
            targetGraphic =
                unitOfWork.PlayoutQueueRepository.FindSingle(q => q.Id == queueId, q => q.Graphics)
                          .Graphics.Where(g => g.QueuePosition < startPosition)
                          .OrderByDescending(g => g.QueuePosition)
                          .Take(1).FirstOrDefault();
        }
        else
        {
            targetGraphic =
                unitOfWork.PlayoutQueueRepository.FindSingle(q=> q.Id == queueId, q => q.Graphics)
                          .Graphics.Where(g => g.QueuePosition > startPosition)
                          .OrderBy(g => g.QueuePosition)
                          .Take(1).FirstOrDefault();
        }

        // Swop the positions
        if (targetGraphic == null) return;

        sourceGraphic.QueuePosition = targetGraphic.QueuePosition;

        targetGraphic.QueuePosition = startPosition;

        unitOfWork.GraphicRepository.Update(sourceGraphic);
        unitOfWork.GraphicRepository.Update(targetGraphic);

        // Save to database
        unitOfWork.Save();
    }
} 

通过 Web Api 调用运行此方法大约需要 2 秒才能运行,我有点困惑为什么需要这么长时间,预计不到一秒,有什么建议可以加快速度。

我们要做的就是改变两个图形对象的队列位置 - 交换队列位置 - 我们当前的一个与队列中的下一个基于位置。

不确定这是 EF5 还是我的 LINQ 查询效率低下。

存储库上的 FindSingle 看起来像这样

public T FindSingle(Expression<Func<T, bool>> predicate = null, params Expression<Func<T, object>>[] includes)
{
    var set = FindIncluding(includes);
    return (predicate == null) ? set.FirstOrDefault() : set.FirstOrDefault(predicate);
} 

public IQueryable<T> FindIncluding(params Expression<Func<T, object>>[] includeProperties)
{
    IQueryable<T> set = _context.GetEntitySet<T>();

    if (includeProperties != null)
    {
        foreach (var include in includeProperties)
        {
            set = set.Include(include);
        }
    }

    return set.AsQueryable();
}

我感觉可能需要更改它以接收两个对象,然后只进行更新,但这可能掩盖了我们必须在以后解决的问题,因为这应该很简单。

【问题讨论】:

  • 这是您在运行应用程序时使用 EF 所做的第一个想法吗?如果是这样,您可能会遇到 EF 的启动成本,这可以通过多种方式降低。例如,如果您首先使用代码,您可以关闭数据库初始化。您可以预先生成映射视图来避免这种情况。首先要做的是触发几次调用。看看第二次会不会快很多。
  • FindSingle 长什么样子?看起来你在这里做了很多数据库查询。如果可能,您应该尝试将它们合并为一个。
  • 朱莉,这不是我们第一次打电话,我们已经多次运行这个查询,它总是在两秒左右
  • marcin - 刚刚添加了额外的代码部分
  • 您正在加载完整的 Graphics 集合,然后 Take 仅在内存中加载一个元素。 Graphics 集合是否如此之小,以至于您预计此过程不会产生任何重大开销(这对于较大的集合而言效率低下)?

标签: c# performance linq entity-framework ef-code-first


【解决方案1】:

这是我们在保存调用中设置的通知服务(因此其他服务/应用程序知道数据库上发生了什么更改) - 这会导致异常增加延迟,一旦我们输入正确的 IP,延迟约为 0.7 毫秒,这是我所期待的

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-25
    • 2013-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多