我的目标是从转换表中获取大量的行。我使用一个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