我在 Linq DataContext 周围有一个装饰器,我想将其用于缓存。存储库返回映射数据库类型之一的 IQueryable。如果我的意图是提高性能,这是一个好主意吗?有时,该方法将返回一个来自 List 的 IQueryable,而其他时候,它会直接来自 DataContext。使用此配置,某些查询会因 Stackoverflow 异常而崩溃。
查询:
IDataContext ctx = DataContextFactory.ctx();
IQueryable<PositionsVF> positions = from p in ctx.Repository<PositionsVF>()
from c in ctx.Repository<ConfigurationPortefeuillesModule>()
where c.Module.Module1 == ListeModules.POSITIONS_VF.ToString() &&
p.NoPortefeuille_FK == c.NoPortefeuille_FK &&
p.PortefeuillesSpecialise.Categorie != "REGROUPEMENT" &&
p.NoFond_FK == fonds &&
p.Date == dateDonneeBD
orderby c.Ordre
select p;
编码:
Dictionary<string, List<object>> CachedTables = new Dictionary<string, List<object>>();
// Small tables which are queried against a lot.
List<string> ShouldCache = new List<string>() {
//typeof(DerniersSoldesDAV).Name,
//typeof(Fond).Name,
//typeof(PortefeuillesSpecialise).Name,
//typeof(PortefeuillesSuperposition).Name,
//typeof(PositionsVF).Name,
//typeof(PoidsACWI).Name,
//typeof(PositionsSASMurex).Name,
//typeof(TypesCompte).Name,
//typeof(TypesMontant).Name,
//typeof(Module).Name,
typeof(CorrespondanceIndice).Name,
typeof(CorrespondancePortefeuille).Name,
//typeof(CorrespondancePortefeuillesPGP).Name,
//typeof(CorrespondanceRegroupement).Name,
//typeof(CorrespondancesPortefeuillesSuperposition).Name,
//typeof(ConfigurationFondsModule).Name,
//typeof(ConfigurationIndicesModule).Name,
//typeof(ConfigurationPortefeuillesFondsModule).Name,
//typeof(ConfigurationPortefeuillesModule).Name,
};
public IQueryable<T> Repository<T>() where T : class
{
ITable table = _context.GetTable(typeof(T));
string typeName = typeof(T).Name;
if (ShouldCache.Contains(typeName))
{
// Load the mini table.
if (! CachedTables.ContainsKey(typeName))
{
var tableRows = table.Cast<T>().ToList();
CachedTables.Add(typeName, tableRows.Cast<object>().ToList());
}
return CachedTables[typeName].Cast<T>().AsQueryable();
}
return table.Cast<T>();
}