C# 多个延迟执行与一次检索

C# 多个延迟执行与一次检索,c#,linq-to-sql,C#,Linq To Sql,以下场景中最快的解决方案是什么: 我有一个对象列表,我需要排除与表中的行匹配的任何对象(SQLCE) 下面是psuedo代码的两种方式 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

以下场景中最快的解决方案是什么:

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

下面是psuedo代码的两种方式

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
}
DataContext dc=newdatacontext();
var dbOjbToExclude=dc.Tables
.其中(……)
.Select(r=>newhelperobj{r.prop1,r.prop2})
.ToList();
foreach(myOriList中的var项)
{
如果(!dbObjToExclude.Any(r=>r.prop1==item.prop1&&r.prop2==item.prop2))
//将项目添加到新集合
}

哪个更快?正如我所说,这是sqlce和linq-to-sql的组合,所以我很想知道在性能方面哪一个更好。

我不认为多个调用和一个调用之间有什么区别。在这两种情况下,对DB的查询将发生在foreach循环需要结果列表的地方。不同之处在于,第一个查询将返回整个表,而第二个查询将只返回您请求的两个字段。所以我认为第二种方法更有效。

我想最好的方法是在使用Any(var dbOjbToExclude=dc.Tables.Where(..).Select(r=>r.ToArray())@StefanoAltieri之前具体化结果-db中数据集的大小没有影响?内存方面?除非您有数千行,否则它将比多次往返到数据库更快。我认为第二次将比第一次慢,因为您正在执行与第一次相同的操作,并为每一行创建一个新对象。@brian这也应该推迟。
Where
Select
正在创建新的实体对象(相同的基本内容),它们被延迟(顺便说一句,您不需要
。在第一个示例中,选择(r=>r)
,Where为您做这件事)。如果您不想让它延迟,那么
ToList
/
ToArray
会这样做。如果你得到了大量的数据,那可能会失败。延迟执行将把数据分成行卡盘进行处理。。。