我已經看過與此類似的其他問題,但找不到任何可行的答案。將lambda表達式轉換爲緩存的唯一鍵
我一直在使用下面的代碼來生成唯一鍵,用於將我的linq查詢的結果存儲到緩存中。
string key = ((LambdaExpression)expression).Body.ToString();
foreach (ParameterExpression param in expression.Parameters)
{
string name = param.Name;
string typeName = param.Type.Name;
key = key.Replace(name + ".", typeName + ".");
}
return key;
它似乎適用於包含整數或布爾值的簡單查詢,但當我的查詢包含嵌套的常量表達式例如
// Get all the crops on a farm where the slug matches the given slug.
(x => x.Crops.Any(y => slug == y.Slug) && x.Deleted == false)
返回的關鍵是這樣的:
(真AndAlso(Farm.Crops.Any(Y => (值(OzFarmGuide.Controllers.FarmController + <> c__DisplayClassd).slug == ySlug))AndAlso(Farm.Deleted == False)))
正如您所看到的,我通過的任何農作物名稱都會給出相同的關鍵結果。有沒有一種方法可以提取給定參數的值,以便我可以區分我的查詢?
而且轉換y
說正確的類型名稱將是很好.....
什麼是錯用'GetHashCode()'方法和'HashSet'?它不是唯一的,但大多數情況下'HashSet'能夠接收和添加O(1)中的項目。 –
2012-03-17 03:16:48
@CommuSoft,這是行不通的,因爲即使看起來完全相同的兩個表達式也不會被認爲是相等的(除非你提供了你自己的相等比較器)。 – svick 2012-03-17 04:08:00
@CommuSoft - 此外,哈希碼不保證是唯一的,因此您的代碼中的潛在錯誤 – Polity 2012-03-17 05:20:08