我们有以下两个非常好的查询。它们在各方面都是相同的,只有一个:其中一个指向IQueryable,表示Entity Framework与本地SQL服务器的连接,另一个表示一个List,理论上它包含完全相同的数据。
var databaseQuery = db.Table.First(Test);
var listQuery = list.First(Test);
在这种情况下,我按以下方式创建列表:
var list = db.Table.ToList();
没什么特别的。我只想通过交换几百公顷的ram来改善查询在我的开发机器上的糟糕表现,比如,我生命中的半个小时,我永远不会回来。只有一个小问题:
var listQuery = list.First(Test);
我总是总是在那一行得到一个例外,就在那里,说序列中没有匹配的元素。
到底是怎么回事?
编辑:由于你问的很好,在这种情况下的测试比较两个长的值。
进一步编辑:这是实际代码,直接从IDE剪切。这个.First()被添加到IQueryable或IEnumerable的末尾 - 一个内存堆实体或一个数据库链接。
.First(v =>
v.UserID == mm.SystemUserId
&& validMerchants.Contains(v.ActualMerchantId.Value));
Slauma:我没有说它永远不会是空的。我只是说它为null会抛出一个不同的异常。 (你知道,这是有道理的。)
看起来我必须找到一种不同的方法来加快速度。
答案 0 :(得分:0)
我想不出任何应该触发这个的东西,除了,正如所建议的,两种情况之间的不同行为为null但是我可以建议一个非常简单的方法来调试这个
你说DB版本返回结果但是内存没有,反过来会更难调试但这很容易,从db版本结果集,做一个.First()&记下ID
在内存中更改内存中的一个。在您的第一个()
之前(检查您知道应该在数据库集中匹配的特定ID)在第一个lambda(不在.First()行上但在v =>行上)放置一个断点,它应该只匹配匹配的内容(因为你已经从where处过滤了其他所有内容)。然后在该断点上,将lambda的内容复制/粘贴到即时窗口以查看它返回false的原因,测试那些直到你发现返回false和&那么它应该是明显的错误,如果它不是在这里发布结果&我们可以深入挖掘这一点。
第一次测试:v.UserID == mm.SystemUserId&& validMerchants.Contains(v.ActualMerchantId.Value) 第二次测试:v.UserID == mm.SystemUserId 第3次测试:validMerchants.Contains(v.ActualMerchantId.Value)
如果其中任何一个返回false,那么您知道它不匹配,是时候检查数据&明白为什么。如果一切都恢复正常,首先应该返回该元素&你没有错误,所以我很确定“某些东西”会返回错误。如果其中一个返回false(v.UserId,mm.SystemUserId,& v.ActualMerchantId.Value的值)
,也要确保发布所有内容的结果。