2016-02-12 108 views
0

我有我的EntityFramework使用類:爲什麼建築需要花費大量的時間?

public partial class BaseDocument 
{ 
    public BaseDocument() 
    { 
     DocumentLinks = new List<DocumentLink>(); 
    } 
    public int Id {set;get;} 
    public virtual List<DocumentLink> DocumentLinks {set;get;} 
} 

public partial class Payment:BaseDocument 
{ 

} 

public partial class Bill:BaseDocument 
{ 

} 

public partial class DocumentLink 
{ 
    public int Id{set;get;} 
    public int StartDocId{set;get;} 
    public int EndDocId{set;get;} 

    public virtual BaseDocument StartDoc{set;get;} 
    public virtual BaseDocument EndDoc{set;get;} 
} 

現在我選擇使用LINQ文件,並希望通過他的DocumentLinks的列表進行迭代。

var payment = dbContext.Payments.First(t=>t.Id = id); 
foreach(var link in payment.DocumentLinks) 
{ 
    if (link is Payment) 
    { 
    //do something 
    } 
    else if (link is Bill) 
    { 
    //do something 
    } 
} 

而且我的代碼在行if (link is Payment)上工作非常緩慢。在這條線以後,一切工作都很快。

出了什麼問題?

+0

你能定義什麼是慢?你什麼時候測量? 'link'在'if(link ...)'之前被實例化,你的意思是?或者你的意思是'//在'Paymant'分支中執行某些代碼太慢了(但你沒有顯示它)? – Sinatr

+0

你可能的「第n + 1個問題」的受害者:在'DocumentLinks' http://stackoverflow.com/questions/97197/what-is-the-n1-selects-issue – Rune

回答

2

你的意思是在實際執行數據庫查詢行慢?提示 - 這就是爲什麼它很慢。

var payment = dbContext.Payments.First(t => t.Id = id);

我無法看到付款如何包含DocumentLiks - 這意味着它們被延遲加載。這意味着這發生在foreach中。你去了。慢。

將它們包含在初始查詢中。

+0

我的示例文件,我不沒有任何付款,但其作品無論如何都放在這條線上。而且我不清楚如何在查詢中包含'DocumentLinks? –

+1

如果你不知道如何使用LINQ或實體框架,你應該閱讀文檔。包含(在兩個版本中,一個接受一個字符串,一個lambda)是EF方法(System.Data.Entity命名空間)的LINQ的一部分,並告訴EF重新加載相關元素。這是根本性的 - 我向初級開發人員要求EF工作的問題類型。 – TomTom

+0

是正確的,只是想提及:當然.First()調用也會執行DB調用。然而,這個數據庫調用將只查詢這個表,因爲沒有查詢導航屬性(還),所以在foreach調用中發生聯接(即對FK的表掃描)。 – DevilSuichiro

0

不是直接回答你的問題,但你不應該鍵入嗅探這樣的建議。多態性允許您忽略對象的確切類型,使用它。

放置任何行爲,你需要爲BaseDocument並刪除is Paymentis Bill

var payment = dbContext.Payments[id]; 
foreach(var link in payment.DocumentLiks) 
{ 
    link.DoSomething(); 
} 
0

這可能是因爲延遲加載的。 在你的DbContext配置說明:

this.Configuration.LazyLoadingEnabled = false; 
相關問題