How do I cache an IQueryable object?

2019-02-24 08:43发布

I've got this method that returns a Linq-to-SQL query for all the rows in a 'UserStatus' table:

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;
}

It's just a look-up table that will hardly ever change so I'd like to cache the results. I can convert it to a List<> and cache that, but I'd prefer to return an IQueryable object as other methods in the class depend on that. Can anyone help? Thanks.

4条回答
趁早两清
2楼-- · 2019-02-24 09:18

You can't really do this--the Querable is more a pointer than the data. If you are caching, you are caching data, so you need to have the data loaded. Yapiskan has the right idea--cache the resulting ToList() and bring it back to AsQueryable().

Do note that the cached list won't have a DataContext so your query options will be limited to data loaded in the list.

查看更多
Fickle 薄情
3楼-- · 2019-02-24 09:38

I would have to ask what you are actually wanting to cache? The query or the results?

If its the results then the suggestions above make sense, but if you are wanting to cache the query for later use then may I suggest using CompiledQuery and then storing that somewhere...

Here is an article about CompiledQuery and how to use it.

Again it all depends on whether you want the the query to have been executed or not...

查看更多
成全新的幸福
4楼-- · 2019-02-24 09:40

could query.ToList().AsQueryable() be a solution for you? not the best one sure.

查看更多
太酷不给撩
5楼-- · 2019-02-24 09:41

Take a look at the Enterprise Library caching application block. It is a very good general purpose caching architecture.

查看更多
登录 后发表回答