如果对查询的请求很多,则IQueryable或List

问题描述 投票:1回答:1

获取物品有两种选择。我知道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...
}
c# list linq-to-sql iqueryable
1个回答
1
投票

请求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();
© www.soinside.com 2019 - 2024. All rights reserved.