2012-01-09 148 views
0

我有一个名为IDsList的整数列表,用于使用实体框架连接从名为MyTbl的表中提取XML列表。 XML字符串然后用于执行其他任务。以下哪一项会更好?循环中的实体框架连接

方法1

var IDsList = new List<Int32>() {17, 23, 47, 62, 63, 79, 85, 91, 100}; // user input 
List<String> XMLStrs = null; 
using (var ctx = new DatabaseEntities()) { 
    XMLStrs = IDsList.Select (i => Ctx.MyTbl.First (tr => tr.id == i).xml_str).ToList(); 
} 
XMLStrs.AsParallel().ForAll (xs => { 
    // Do something in parallel 
}); 

方法2

var IDsList = new List<Int32>() {17, 23, 47, 62, 63, 79, 85, 91, 100}; // user input 
IDsList.AsParallel().ForAll (i => { 
    using (var ctx = new DatabaseEntities()) { 
     var xs = ctx.MyTTbl.First (tr => tr.id == i).xml_str; 
     // Do something with xs 
    } 
}); 

还是有不同的方法,该方法是更地道C#?

请注意 IDslist通常是一个更长的列表,通常数以千计的长度。并且每个独立的xs执行时间与其他时间大致相同。

+0

你应该注意的是,根据亲和力的机器和你的过程,方法#2可以创建大量的数据库连接,本质上触发一些网络中的DOS过滤器。 – doogle 2012-01-09 18:54:16

回答

0

如果你正在试图获得具有存在于IDsList,与EF 4.1的ID行,您可以在查询中使用。载:

var IDsList = new []{17, 23, 47, 62, 63, 79, 85, 91, 100}; // user input 
List<string> XMLStrs = null; 
using (var ctx = new DatabaseEntities()) 
{ 
    XMLStrs = (from tr in Ctx.MyTbl 
       where IDsList.Contains(tr.id) 
       select tr.xml_str).ToList(); 
} 
+1

我认为OP是特别询问Parallel LINQ ... – Yuck 2012-01-09 18:52:41

+0

再次阅读他的问题,他的代码示例特别指出问题是从列表“IDsList”中的整数值指定的数据库中获取行。 – doogle 2012-01-09 18:56:43

+0

不......这个问题涉及匹配一个非常大的ID值列表。因此并行处理。虽然使用'Contains()'是在SQL中转换为'IN'的正确方法,但真正的问题是使用PLINQ更喜欢哪种方法。 – Yuck 2012-01-09 19:10:47