查询适用于数据库但不适用于内存?

时间:2013-10-10 21:13:16

标签: c# sql linq entity-framework

我们有以下两个非常好的查询。它们在各方面都是相同的,只有一个:其中一个指向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会抛出一个不同的异常。 (你知道,这是有道理的。)

看起来我必须找到一种不同的方法来加快速度。

1 个答案:

答案 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的值)

,也要确保发布所有内容的结果。