繁体   English   中英

加快EF5代码优先查询

[英]Speed up EF5 Code First query

使用EF5代码优先,SQL Server 2008 R2数据库,通用存储库和工作单元模式对先前的问题进行后续讨论

我有以下功能

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();
}

我有一种感觉,可能必须更改它以容纳两个对象,然后进行更新,但这可能掩盖了一个问题,我们必须稍后解决,因为这应该很简单。

这是我们在保存调用中设置的通知服务(因此其他服务/应用程序知道数据库中已更改的内容)-这导致了异常,从而增加了延迟,一旦我们输入了正确的IP,延迟就在0.7ms这是我所期望的

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM