2008-11-18 69 views
1

我的目標是從轉換表中獲取大量的行。我使用一個ID來獲取表的一個子集(比如50行),然後我使用另一個ID來從我想要的這個子集中獲得行。使用類型化數據集我做下面讓主數據集:如何從LINQ獲得最佳性能查詢表中的多行

funderTextsDS.tbl_funderTextsDataTable fd = 
(funderTextsDS.tbl_funderTextsDataTable)(new funderTextsDSTableAdapters.tbl_funderTextsTableAdapter()).GetData(); 

然後因爲我想每個值:

fd.Select("eng_code = '" + element + "' and funderID = '" + funderID + "'")[0]["funderText"].ToString(); 

使用螞蟻探查器來檢查我發現,使用這個方法的代碼170頁超過10頁刷新(220調用fd.select ...)

當我重寫了這個LINQ需要超過2000ms來做同樣的工作。這裏是我使用的LINQ代碼:

IrmDatabaseContext irmDB = new IrmDatabaseContext(); 
irmDB.tbl_funderTexts.Single(f => f.funderID == funderId && f.eng_code == element).funderText; 

任何人都有一個這樣做與LINQ的好方法?通過查看sql server profiler,我發現LINQ實際上爲我檢索的每個文本生成了一個select。 (即LINQ =從分貝,TableAdapter的方法= 10個選擇220種選擇)

解決方案: 看了圍繞我發現,大衛B爲在正確的軌道上的網,儘管for循環扔我相當長的後而。無論如何,他所說的訣竅就是使用一個列表,因爲這實際上會強制linq對數據庫運行查詢並將其緩存到本地。 http://blogs.msdn.com/wriju/archive/2007/07/17/linq-to-sql-caching-the-query-execution.aspx

所以我的解決辦法弄成這個樣子:

List<tbl_funderText> fd = (from tf in irmDB.tbl_funderTexts 
         where tf.funderID == (int)cpcrow.cpc_fundingPartnerID 
         select tf).ToList(); 

然後每次我想要一個元素我做的:

fd.Single(f => f.eng_code == element).funderText; 

分析與螞蟻然後我發現時間縮短到150毫秒(約SQL查詢分析器顯示SQL只運行一次

+0

有人可以更好地格式化它,所以它更容易閱讀。 – 2008-11-18 05:57:17

回答

1

啊,所以在TableAdapter方法中,您將行拉入內存,然後再查詢那些內存中的行。這在LINQ中很容易實現。

myDataContext dc = new myDataContext(); 
List<FunderText> myList = myDataContext.tbl_funderTexts.ToList(); 

List<string> result1 = new List<string>(); 
foreach(var theValue in myValues) 
{ 
    result1.Add(
    myList.First(f => f.funderID == theValue.funderId && f.eng_code == element).funderText 
); 
} 
0

我不確定這是否會幫助,但嘗試使用.where而不是.single。像這樣:

var data = mDB.tbl_funderTexts.where(f => f.funderID == funderid && f.eng_code == element) 
var fundertext = data.single().funderText 
+0

實際上,Single(predicate)應該優於Where(predicate).Single(),因爲它允許身份緩存使用而不需要往返。請參閱連接:https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=362313 – 2008-11-18 06:32:46

+0

ahhh我明白了,謝謝。 – 2008-11-22 08:32:20

相關問題