代码之家  ›  专栏  ›  技术社区  ›  Nick

如何缓存IQueryable对象?

  •  4
  • Nick  · 技术社区  · 16 年前

    我有一个方法,它为“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 回复  |  直到 16 年前
        1
  •  7
  •   Ali Ersöz    16 年前

    能够 query.ToList().AsQueryable() 是你的解决方案吗?当然不是最好的。

        2
  •  3
  •   Wyatt Barnett    16 年前

    你不能真的这样做——可查询的更像是一个指针,而不是数据。如果您正在缓存数据,那么您需要加载数据。Yapiskan有正确的想法——缓存结果tolist()并将其返回到asqueryable()。

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

        3
  •  2
  •   bytebender    16 年前

    我想问一下你到底想要缓存什么?查询还是结果?

    如果它的结果,那么上面的建议是有意义的,但是如果您希望缓存查询以供以后使用,那么我可以建议使用compiledquery,然后将其存储在某个地方…

    这是一篇关于 CompiledQuery 以及如何使用它。

    同样,这取决于您是否希望查询被执行…

        4
  •  0
  •   JP Alioto    16 年前

    查看企业库 caching application block . 它是一个非常好的通用缓存体系结构。