不重复:我不认为这是重复的,因为在我的具体情况下我觉得忽略警告实际上更好。
例如,
IEnumerable<Item> milionItems = GetAMillionItemsFromDatabase();
var item1 = millionItems.FirstOrDefault(x=> x.Condition == "Excellent");
var item2 = millionItems.FirstOrDefault(x=> x.Condition == "Good");
我在'millionItems'下面收到了警告信息,我知道这意味着什么但是我不确定是否总是值得ToList只是为了摆脱它。
GetAMillionItemsFromDatabase().ToList();
这看起来非常糟糕,因为它会同时将一百万条记录带入内存。
但是,如果我不这样做并继续枚举IEnumerable,即使它会两次打到数据库,它也不会带来所有数据,因为它会找到第一个匹配项并返回。在这种情况下,在我看来,实际上忽略该消息更好。
答案 0 :(得分:5)
很有可能在这种情况下两次转到DB会比通过当前代码执行的IEnumerable
的客户端搜索更好。
如果您无法将搜索推送到数据库(即保持IQueryable<Item>
允许链接),您仍然可以通过检查每个项目的两个条件来优化查找:
foreach(var x in millionItems)
{
item1 = item1 == null && x=> x.Condition == "Excellent" ? x : item1;
item2 = item2 == null && x=> x.Condition == "Good" ? x : item2;
if (item1 != null && item2 != null)
{
break;
}
}
这很有可能通过客户端的很多项目,但至少它不会同时保留在内存中。
使用ToList
转换为列表不太可能更好,如果这些只是您需要构建的2个查询。