如何缓存IQueryable对象?

时间:2009-06-17 17:10:12

标签: asp.net linq caching iqueryable

我有这个方法返回'UserStatus'表中所有行的Linq-to-SQL查询:

public IQueryable<BLL.Entity.UserStatus> GetAll()
{
    var query = from e in _SelectDataContext.UserStatus
                select new BLL.Entity.UserStatus
                {
                    UserStatusId = e.UserStatusId,
                    Enum = e.Enum,
                    Name = e.Name
                };

    return query;
}

它只是一个几乎不会改变的查找表,所以我想缓存结果。我可以将它转换为List<>并缓存它,但我更愿意返回一个IQueryable对象,因为类中的其他方法依赖于此。有人可以帮忙吗?感谢。

4 个答案:

答案 0 :(得分:7)

可以query.ToList().AsQueryable()成为您的解决方案吗?不是最好的确定。

答案 1 :(得分:3)

你无法真正做到这一点 - Querable更像是一个指针而不是数据。如果您正在缓存,则表示您正在缓存数据,因此您需要加载数据。 Yapiskan有正确的想法 - 缓存生成的ToList()并将其带回AsQueryable()。

请注意,缓存列表中没有DataContext,因此您的查询选项将仅限于列表中加载的数据。

答案 2 :(得分:2)

我不得不问你实际想要缓存什么?查询或结果?

如果结果然后上面的建议有意义,但如果你想缓存查询以供以后使用,那么我可以建议使用CompiledQuery然后将其存储在某处......

以下是关于CompiledQuery以及如何使用它的文章。

这一切都取决于你是否想要执行查询......

答案 3 :(得分:0)

查看企业库caching application block。这是一个非常好的通用缓存架构。