Linq-to-entities 到正常的 linq
Linq-to-entities to normal linq
我有这行linq
_cache = _repository.EntitiesNoTracking().Select(k => Crypto.DecryptString(k.KeyValue)).ToHashSet();
这当然行不通,因为 Linq-to-entities 不知道 Crypto.DecryptString
。
所以解决方案可能是
_cache = _repository.EntitiesNoTracking().ToArray().Select(k => Crypto.DecryptString(k.KeyValue)).ToHashSet();
不过,这里面好像多了一个ToArray()
。
我认为下一个代码会更有效率:
var _cache = new HashSet<string>();
foreach(var item in _repository.EntitiesNoTracking()){
_cache.Add(Crypto.DecryptString(item.KeyValue));
}
有没有什么方法可以让 Linq-to-entities 转换为正常的 linq,而无需额外的步骤?
您不需要 EntitiesNoTracking()
因为您有自定义投影。检索到的数据还应受到额外 Select
.
的限制
_cache = _repository.
.Select(k => k.KeyValue)
.AsEnumerable()
.Select(s => Crypto.DecryptString(s))
.ToHashSet();
我有这行linq
_cache = _repository.EntitiesNoTracking().Select(k => Crypto.DecryptString(k.KeyValue)).ToHashSet();
这当然行不通,因为 Linq-to-entities 不知道 Crypto.DecryptString
。
所以解决方案可能是
_cache = _repository.EntitiesNoTracking().ToArray().Select(k => Crypto.DecryptString(k.KeyValue)).ToHashSet();
不过,这里面好像多了一个ToArray()
。
我认为下一个代码会更有效率:
var _cache = new HashSet<string>();
foreach(var item in _repository.EntitiesNoTracking()){
_cache.Add(Crypto.DecryptString(item.KeyValue));
}
有没有什么方法可以让 Linq-to-entities 转换为正常的 linq,而无需额外的步骤?
您不需要 EntitiesNoTracking()
因为您有自定义投影。检索到的数据还应受到额外 Select
.
_cache = _repository.
.Select(k => k.KeyValue)
.AsEnumerable()
.Select(s => Crypto.DecryptString(s))
.ToHashSet();