簡體   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