.net 将.ToLookup()与EF Core查询配合使用的正确方式

iyfamqjs  于 2023-01-10  发布在  .NET
关注(0)|答案(1)|浏览(142)

我正在尝试将.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个集合。
谢啦,谢啦

rryofs0p

rryofs0p1#

ToLookup创建了一个类似于Dictionary<TKey, TValue>的内存中集合,因此无需创建一个列表,然后调用ToLookup,您只会毫无理由地浪费CPU和内存。
因此它类似于ToDictionary,但与GroupBy不同,后者使用“延迟执行”,这意味着当你使用它时,你仍然在数据库上下文中,而查找或字典是已经填充的集合。

相关问题