【发布时间】:2010-12-26 19:23:46
【问题描述】:
我正在尝试确定两个谓词的相等性:
public T FirstOrDefault(Func<T, bool> predicate)
{
if (EntityCache.ContainsKey(predicate.GetHashCode()))
return EntityCache[predicate.GetHashCode()];
else
{
var entity = _objectSet.FirstOrDefault<T>(predicate);
EntityCache.Add(predicate.GetHashCode(), entity);
return entity;
}
}
我遇到的问题是谓词的哈希码没有考虑其中使用的值,我不知道如何检索它们。
例如,如果传递给我们上述方法的谓词是:(r => r.Id == id) 我将如何在我的 FirstOrDefault 方法中查找“id”的值?
【问题讨论】:
-
为什么要这样做?使用
Func<T, bool>的语法的全部意义在于您不知道它是如何实现的。作为FirstOrDefault的实施者,您不知道您的方法的用户 如何选择过滤结果。他们可能选择使用Id属性,或者他们可能有一些完全不同的谓词。对于它的价值,您可以将其转换为采用Func<T, int>并假设他们正在返回 pk,然后您可以调用谓词来获取T的当前实例的值。 -
我想答案是没有简单的方法可以做到这一点,因为我想保持传递任何谓词的灵活性,并且能够以某种方式确定谓词和值集是否相同作为之前通过的。
标签: c# .net .net-4.0 c#-3.0 c#-4.0