在测试LINQ查询中的值是否在列表中时,感到好奇

时间:2017-01-26 13:51:32

标签: .net entity-framework linq

我有这段代码(在VB.NET中,但它应该适用于任何.NET语言),它使用LINQ来检索一些数据库记录:

Dim validIDs = GetValidIDs() //this comes from server memory
Dim qry = From r in db.table
          Where validIDs.Contains(r.ID)
          Select r
Return qry.ToList()

在我的机器和我们的测试/产品服务器上,这比以下慢很多倍:

Dim validIDs = GetValidIDs()
Dim qry = From r in db.table
          Select r
Dim ret = New List()
For Each r in qry
    If Not validIDs.Contains(r.ID) Then Continue For
    ret.Add(r)
Next
Return ret

不同之处在于,在提取记录后,检查记录的ID是否在数据库端与.NET端的有效ID列表中。

为什么这里有如此显着的性能差异?我不一定在寻找修复,只关心LINQ在这里做什么。

1 个答案:

答案 0 :(得分:0)

好的,看起来这个问题是重复的。我在这里找到了答案:https://stackoverflow.com/a/24092704/885128

对于那些感兴趣的人,因为从GetQalidIDs()返回的列表是在LINQ之外生成的,所以LINQ认为它可以改变,所以它不会缓存它可能的一切,导致性能降低。

如果有人将此问题标记为上述链接中的副本,那就太棒了。感谢。