Asp.net 如何缓存IQueryable对象?
我有一个方法,它为“UserStatus”表中的所有行返回Linq to SQL查询:Asp.net 如何缓存IQueryable对象?,asp.net,linq,caching,iqueryable,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 { UserS
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;
}
public IQueryable GetAll()
{
var query=从e进入_SelectDataContext.UserStatus
选择新建BLL.Entity.UserStatus
{
UserStatusId=e.UserStatusId,
Enum=e.Enum,
Name=e.Name
};
返回查询;
}
它只是一个几乎不会改变的查找表,所以我想缓存结果。我可以将其转换为
列表
并缓存它,但我更喜欢返回IQueryable对象,因为类中的其他方法依赖于此。有人能帮忙吗?谢谢。看看企业库。这是一个非常好的通用缓存体系结构。能否为您提供解决方案?当然不是最好的。你真的不能这么做——可查询对象更像是指针而不是数据。如果您正在缓存,那么您正在缓存数据,因此需要加载数据。Yapiskan的想法是正确的——缓存生成的ToList()并将其带回AsQueryable()
请注意,缓存的列表没有DataContext,因此您的查询选项将仅限于列表中加载的数据。我必须询问您实际想要缓存什么?查询还是结果 如果是结果,那么上面的建议是有意义的,但是如果您想缓存查询供以后使用,那么我可以建议使用CompiledQuery,然后将其存储在某个地方 下面是一篇关于和如何使用它的文章
同样,这完全取决于您是否希望该查询已执行…问题在于,如果您想使用它加入另一个查询,您必须稍后将其重新绑定到datacontext。除非您希望联接或筛选器在内存中运行。您不知道AsQueryable()方法。我想我可能会添加一个额外的“List”方法,但这回答了问题,谢谢。public IQueryable GetAllCountries(int?primaryCategoryId,int?secondaryCategoryId){var key=MakeMedia.CustomClasses.Constants.Persistance.PersistanceKeys.AllCountries+primaryCategoryId+secondaryCategoryId;var countries=CacheManager.Get(key);if(countries==null)CacheManager.Insert(key,_repository.GetAllCountries(primaryCategoryId,secondaryCategoryId).ToList());返回CacheManager.Get(key).AsQueryable();}