多次延期执行与一次检索

时间:2013-03-15 12:12:20

标签: c# linq-to-sql

以下情况中最快的解决方案是什么:

我有一个对象列表,我需要排除任何与表中的行匹配的对象(SQLCE)。

下面是两种伪代码方式。

DataContext dc = new DataContext();
var dbOjbToExclude = dc.Tables.Where(..).Select(r=>r);
foreach (var item in myOriList)
{
     if (!dbObjToExclude.Any(r=>r.prop1==item.prop1 && r.prop2==item.prop2))
         //add item to a new collection
}

上面,我猜对于循环中的每个项目,db查询是多次运行的?我只检查对象的许多属性中的两个。另一种方法是仅使用这两个属性获取对象的数据对象集合,并检查该集合中的匹配项:

DataContext dc = new DataContext();
var dbOjbToExclude = dc.Tables
                           .Where(..)
                           .Select(r=> new HelperObj {r.prop1,r.prop2})
                           .ToList<HelperObj>();
foreach (var item in myOriList)
{
     if (!dbObjToExclude.Any(r=>r.prop1==item.prop1 && r.prop2==item.prop2))
     //add item to a new collection
}

哪个更快?就像我说的,这是sqlce和linq to sql组合,所以我很想知道哪个更好做,性能方面。

1 个答案:

答案 0 :(得分:0)

我不认为多个电话和一个电话之间存在差异。在这两种情况下,对DB的查询都将发生在foreach循环需要结果列表的位置。区别在于第一个查询将返回整个表,但第二个查询将仅返回您要求的几个字段。所以我会说第二个会更有效率。