我的目標是從轉換表中獲取大量的行。我使用一個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只運行一次
有人可以更好地格式化它,所以它更容易閱讀。 – 2008-11-18 05:57:17