gpt4 book ai didi

c# - 缓存 Linq 查询 - 这可能吗?

转载 作者:太空狗 更新时间:2023-10-29 23:40:00 25 4
gpt4 key购买 nike

所以,这看起来像是一个边缘案例,但我只是想知道这是否可能。我所拥有的是包含在 IEnumerable 中的静态集和延迟集的组合 - 例如:

public IEnumerable<T> MakeMyQuery<T>()
{
// returns a List<T>
var someStaticData = LoadMyStaticDataFromDatabase();

// Returns IEnumerable<T>, but from another resource
var deferredQuery = CreateADeferredQueryUsingYieldReturn();

return someStaticData.Concat(deferredQuery);
}

所以这里发生的是,当我在我的可枚举对象上调用 .Take(someNumber) 时,它将首先从我的静态数据中返回元素,然后再尝试评估延迟组件 - 实际上,我有“隐藏”一些可能耗时的生成任务在可枚举的背后,这样如果我永远不需要获取这些元素,由于 LINQ 的延迟性质,它们实际上永远不会被评估。

但是,我认为不可能缓存此查询供以后使用(我不相信 Iterator 的状态会保留在缓存中,对吗?)或者是否有一种无需枚举即可执行此操作的简单方法结果要保存?

理想情况下,我的流程应该是这样的:

public List<T> SomeMethod<T>(int numberOfGuys)
{
IEnumerable<T> query = null;

if(// Is in Cache)
query = Cache["MyQuery"];
else
{
query = MakeMyQuery();
Cache["MyQuery"] = query;
}

return query.Take(numberOfGuys).ToList();
}

所以我可以一遍又一遍地重复使用相同的查询来请求数据,但可能永远不必重新查询数据库。有办法做到这一点吗?

最佳答案

我想你想缓存 query.Take(numberOfGuys).ToList() 的结果在新列表中。调用前MakeMyQuery()您可以查看缓存列表中的元素数量(如果存在)以及缓存列表中的元素数量是否大于或等于 numberOfGuys然后你会返回 numberOfGuys从您的缓存列表中。否则,您将用 query.Take(numberOfGuys).ToList() 的新结果替换缓存列表。 .

正如 default.krammer 所指出的,您真正想要缓存的可能是 LoadMyStaticDataFromDatabase() 的结果。因为如果numberOfGuys总是小于 LoadMyStaticDataFromDatabase() ,您最终会反复访问数据库,直到 numberOfGuys大于 LoadMyStaticDataFromDatabase() 返回的数字.所以你可以做缓存的组合 LoadMyStaticDataFromDatabase()MakeMyQuery<T>()方法和缓存 query.Take(numberOfGuys).ToList()SomeMethod<T>(int numberOfGuys) ,这将允许您只访问数据库一次,但仍然可以利用 IEnumerable<T> 的延迟执行.

关于c# - 缓存 Linq 查询 - 这可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14902354/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com