1

我在 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>();
  }
4

0 回答 0