获取物品有两种选择。我知道IQueryable有延迟加载,并且List
(.ToList()
)立即执行。每次传递循环或仅在第一次迭代时,请求items.FirstOrDefault()
向数据库发出请求吗?或者我还应该转换为List
吗?
var items = _someDbContext.Items.Where(x => x.Date >= DateTime.Now.Date.AddMonth(-3);//IQueryable<Items> result
var items = _someDbContext.Items.Where(x => x.Date >= DateTime.Now.Date.AddMonth(-3).ToList();//List<Items> result
foreach (var oneData in someData)
{
var searchedItems = items.FirstOrDefault(x => x.SomeField == oneData.SomeField);
//...some code...
}
请求items.FirstOrDefault()每次传递循环时都会向数据库发出请求
如果items仍然是IQueryable
,这将通过循环在每次迭代时向数据库发送查询。
如果items是List<T>
,那么您已经将数据库中的所有结果检索到内存中。因此,在循环中调用FirstOrDefault
只会在内存中集合中进行搜索。
哪一个更有效将取决于很多因素。循环并发出一堆查询通常被称为“聊天API”并且不赞成。如果您可以进行一次点击并获取内存中的所有数据,然后在那里进行过滤,那么您可能会比进行数据库的所有往返更好。
当然,如果结果集很大,这可能会占用应用程序的内存。如果它必须扫描一些表的大部分,它在数据库方面也可能是坏的。
如果您可以将其他搜索条件推送到查询中,则更好的方法是。看起来这样可行:
var listOfSomeField = someData.Select(x => x.SomeField).ToList();
var items = _someDbContext.Items
.Where(x =>
x.Date >= DateTime.Now.Date.AddMonth(-3)
&& listOfSomeField.Contains(x.SomeField))
.ToList();