【发布时间】:2014-02-08 00:29:39
【问题描述】:
我有以下简单的缓存类,我想用它来缓存经常从数据库中读取的项目。
public class Cache<TKey, TElement>
where TElement : class
{
private Dictionary<TKey, TElement> cache = new Dictionary<TKey, TElement>();
private Func<TElement, TKey> dbKey;
public Cache(Func<TElement, TKey> dbKey)
{
this.dbKey = dbKey;
}
public TElement Get(TKey key, DataContext db)
{
if (cache.ContainsKey(key)) return cache[key];
// This line throws exception. See below
var value = db.GetTable<TElement>().SingleOrDefault(x => dbKey(x).Equals(key));
if (value != null) cache[key] = value;
return value;
}
}
用法如下:
var db = new DataContext();
var userCache = new Cache<string, User>(u => u.Username);
userCache.Get("dave", db);
但是,指示的行会引发 NotSupportedException,并显示消息“方法 'System.Object DynamicInvoke(System.Object[])' 没有支持的 SQL 转换。”我理解为什么抛出异常,但我不确定如何解决它。
缓存旨在在许多不同的数据库表前运行,不同的列用于查找键。我的想法是传入一个 lambda 来指定查找列,正如您在代码中看到的那样。这适用于 IEnumerable,但不适用于 IQueryable。
在 LINQ to SQL 中还有其他方法可以实现这一点吗?
【问题讨论】:
标签: c# sql linq linq-to-sql