我正在尝试将.ToLookup()
方法与EF Core查询一起使用,并想知道使用它时的最佳实践是什么,我是应该首先将查询缓冲到列表中,还是直接在IQueryable
上调用.ToLookup()
?
var lookup = DbContext.Foo.Where(f => f.Id > 1).ToLookup(f => f.Id);
//vs:
var lookup = (await DbContext.Foo.Where(f => f.Id > 1).ToListAsync(cancellation)).ToLookup(f => f.Id);
我主要担心的是ToListAsync
方法将异步执行查询,而直接.ToLookup
调用 * 看起来 * 像是将阻塞,直到返回查询结果。
然而,正如@Tim提到的,ToListAsync
方法最终将在内存中创建2个集合。
谢啦,谢啦
1条答案
按热度按时间rryofs0p1#
ToLookup
创建了一个类似于Dictionary<TKey, TValue>
的内存中集合,因此无需创建一个列表,然后调用ToLookup
,您只会毫无理由地浪费CPU和内存。因此它类似于
ToDictionary
,但与GroupBy
不同,后者使用“延迟执行”,这意味着当你使用它时,你仍然在数据库上下文中,而查找或字典是已经填充的集合。