2014-01-23 12 views
0

如何加快基於密鑰提取多個對象的查詢?如何加速從多個表中提取單個對象的查詢?

例如(原諒我的人爲的例子),說我有多個表文件,和SQL Server 文件。每個文件記錄有一個文件「父」,每個文件記錄有一個紙「父」。一篇論文可能有多個文件,因此最終會有多個與該論文相關的文件。

紙臺


int Paper_Key - PK 

varchar Paper_Name 

文獻表


int Document_Key - PK 

int Paper_Key 

varchar Doc_Name 

文件表


int File_Key - PK 

int Document_Key 

從文件級別,說我們要檢索文檔和與特定文件相關聯的文件(有幾百萬行的所有這些表)。

我最初的想法是將我的工作單元模式與我的通用存儲庫一起使用,並按鍵檢索每條記錄。

服務方法

public MyViewModel GetFileWithDetails(int fileId) 
{ 
    File file = _unitOfWork.FileRepository.GetById(fileId); 
    Document doc = _unitOfWork.DocumentRepository.GetById(file.Document_Key); 
    Paper paper = _unitOfWork.PaperRepository.GetById(doc.Paper_Key); 

    var model = new MyViewModel 
    { 
     FileKey = file.File_Key, 
     // etc etc 
    } 

    return model; 
} 

通用庫法

internal MyDBEntities context; 
internal DbSet<TEntity> dbSet; 

public GenericRepository(MyDBEntities context) 
{ 
    this.context = context; 
    this.dbSet = context.Set<TEntity>(); 
} 

public TEntity GetById(object id) 
{ 
    return dbSet.Find(id); 
} 

會不會有什麼辦法更快地執行這個查詢?我對大多數其他頁面(細節,列表)使用相同的模式,但從多個表中選擇似乎需要更多的時間 - 特別是因爲每個查詢都必須等待前一個結果能夠執行。

編輯 不幸的是,表格之間沒有關係。只有鑰匙。我要求繪製關係,但是由於空值或某些原因,SQL不會允許......我不負責這些表格。

+1

嘗試將索引添加到參照鍵,然後重建索引以查看一些性能改進。 – Saravanan

回答

1

使用Include方法執行連接多個表的單個查詢。

沒有人說存儲庫不能考慮其他數據類型,只需選擇中心對象並將該方法放入繼承了您的通用基礎知識庫的存儲庫中即可。

+0

數據庫中沒有繪製關係,它目前只使用鍵。這是我的第一個願望,但負責的IT人員出於某種原因不能在表格之間繪製關係。 – Cody

+1

如果您沒有真正的關係,那可能是您問題的一大部分。 –

+0

我同意,我幾個月來一直在要求他們,並試圖解釋沒有關係導致速度問題。所以現在我正試圖尋找其他方法來提高效率。 – Cody

0

嘗試使用.Include來恢復相關實體。

相關問題