2008-11-18 70 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

相关问题