2017-11-21 2 views
-1
public List<DepartmentsModel> GetDepartmentsByCompanyDB(int companyID){ 
     //How will I pass the companyID value to the function? 

     return GetObjectFromCache<List<DepartmentsModel>>(string.Format("Departments{0}", "ALL"), 60 * 8,GetDepartmentsByCompanyDB); 
} 

private List<DepartmentsModel> GetDepartmentsByCompanyDB(int companyID) 
{ 
     procurementEntities db = new procurementEntities(); 
     var result = (from a in db.departments 
         where a.CompanyID == companyID 
         select new DepartmentsModel 
         { 
          CompanyID = a.CompanyID, 
          DateCreated = a.DateCreated, 
          DateLastUpdated = a.DateLastUpdated, 
          ID = a.ID, 
          IsActive = a.IsActive, 
          Name = a.Code + " | " +a.Name, 
          Type = a.Type, 
          Code=a.Code 

         }).ToList<DepartmentsModel>(); 

     return result; 

    } 

//http://www.codeshare.co.uk/blog/simple-reusable-net-caching-example-code-in-c/ 
private static T GetObjectFromCache<T>(string cacheItemName, int cacheTimeInMinutes, Func<T> objectSettingFunction) 
    { 
     ObjectCache cache = MemoryCache.Default; 
     var cachedObject = (T)cache[cacheItemName]; 
     if (cachedObject == null) 
     { 
      CacheItemPolicy policy = new CacheItemPolicy(); 
      policy.AbsoluteExpiration = DateTimeOffset.Now.AddMinutes(cacheTimeInMinutes); 
      cachedObject = objectSettingFunction(); 
      cache.Set(cacheItemName, cachedObject, policy); 
     } 
     return cachedObject; 
    } 
+1

( "部署{0}"、 "ALL")'だけではなく '」:

私はキャッシュキーはの線に沿ってもっと何かする必要があります信じていますDepartmentsALL ""? –

+0

あなたのキャッシュキーは$ "AllDepartmentsForCompany {companyId}"でなければならないと思います.EFは1つの会社のすべての部門を取得します。そのキーをキャッシュキーに含めることができます。 – StuartLC

+0

また、同じクラスに同じシグネチャを持つ2つのメソッドを持つことは合法ではありません( 'private'と' public'キーワードでは区別できません)。 –

答えて

0

どのように私はTL任意のパラメータ

を受け付けないFuncにパラメータを供給することができます。DR

は、その上に閉じることにより、ラムダを使用してスコープの変数をキャプチャします。

説明

代わりにキャッシュミスFuncmethod group syntaxを使用して、あなたはゼロのパラメータを持つ関数とそれを交換する必要があります - ここで撮影しcompanyId使用してラムダとの例です:

return GetObjectFromCache<List<DepartmentsModel>>($"AllDepartmentsForCompany{companyId}", 
60 * 8, 
() => GetDepartmentsByCompanyDB(companyId)); 

根拠

:つのパラメータを取る関数のメソッドグループの構文を使用することと等価です キャッシュミスによって必要な Funcがパラメータを取らないので、動作しません
x => GetDepartmentsByCompanyDB(x) 

からGetObjectFromCacheは、この場合には、パラメータxを提供していません:

cachedObject = objectSettingFunction(); // No parameter 

ますしかし、それでもラムダでそれを閉じてcompanyIdをキャプチャできます。

バート・キャッシュキー私はまた、あなたがキーあなたのキャッシュに論理的なバグを持っていると信じてい

string.Format("Departments{0}", "ALL") 

私には意味がありません - あなたは、与えられた会社の全部門をキャッシュしています。キャッシュキーにcompanyIdを使用する必要があります。そうしないと、すべての企業がキャッシュヒット中に同じDepartmentsを返します。なぜあなたは `String.Formatのをやっている

$"AllDepartmentsForCompany{companyId}" 
+0

これはすでに動作しています。 – NBT

関連する問題